2017-01-12 130 views
0

所以我有這個應用程序在其中必須作出RecyclerView其中包含可以刪除/編輯e.t.c的項目列表。在Android中以編程方式編輯RecyclerView項目

我在YouTube上跟隨了一個教程,並在另一個佈局和該項目的自定義適配器上製作了自定義CardView項目。

事情是,根據項目的狀態,我必須改變一些東西(例如背景顏色或文字顏色)。

當我在RecyclerView活動中這樣做時,即使我擁有該ID,也會獲得NullPointerException

如何在我進行Retrofit調用的時候編輯這些項目中的TextViews

boolean isEnded; 
       if(!endedAt.equals("null")) 
       { 
        endedAt = endedAt.substring(endedAt.indexOf("T") + 1, endedAt.lastIndexOf(":")); 
        isEnded=true; 
       } 
       else 
       { 
        endedAt="ongoing"; 
        isEnded=false; 
       } 
       item.timeDifference=createdAt+" - "+endedAt; 
       if(externalSystem.equals("null")) 
       { 
        item.externalSystem=""; 
       } 
       else 
       { 
        item.externalSystem = externalSystem; 
       } 
       Log.i("attr",externalSystem); 
       items.add(item); 

       itemAdapter=new ItemAdapter(getApplicationContext(), items); 
       recyclerView.setAdapter(itemAdapter); 
       if(isEnded) { 
       error-> externalSystemView.setTextColor(Color.BLACK); 
       } 

該應用程序相當大,但我認爲你可以從這段代碼中獲得創意。

以下是錯誤:嘗試上的空對象引用調用虛擬方法「無效android.widget.TextView.setTextColor(int)的」

public class ItemAdapter extends  
RecyclerView.Adapter<ItemAdapter.ItemViewHolder>{ 

private Context context; 
private ArrayList<Item> itemList; 

public ItemAdapter(Context context, ArrayList<Item> itemList) 
{ 
    this.context=context; 
    this.itemList=itemList; 
} 

@Override 
public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    LayoutInflater layoutInflater=LayoutInflater.from(parent.getContext()); 
    View view=layoutInflater.inflate(R.layout.item_layout,parent,false); 
    ItemViewHolder itemViewHolder=new ItemViewHolder(view); 
    return itemViewHolder; 
} 

@Override 
public void onBindViewHolder(ItemViewHolder holder, int position) { 
    Item item=itemList.get(position); 
    holder.timeDifference.setText(item.timeDifference); 
    holder.title.setText(item.title); 
    holder.timeCounter.setText(item.timeCounter); 
    holder.externalSystem.setText(item.externalSystem); 
    holder.type.setText(item.type); 
    holder.project.setText(item.project); 
    MY IDEA 
    "holder.timeDifference.setTextColor(Color.parseColor(item.color));" 
} 

@Override 
public int getItemCount() { 
    if(itemList!=null) 
     return itemList.size(); 
    else 
     return 0; 
} 


    public static class ItemViewHolder extends RecyclerView.ViewHolder 
{ 
    public CardView cardViewItem; 
    public TextView title; 
    public TextView project; 
    public TextView externalSystem; 
    public TextView timeDifference; 
    public TextView timeCounter; 
    public TextView type; 

    public ItemViewHolder(View itemView) 
    { 
     super(itemView); 
     cardViewItem=(CardView)itemView.findViewById(R.id.card_view_item); 
     title=(TextView)itemView.findViewById(R.id.title); 
     project=(TextView)itemView.findViewById(R.id.project); 
     externalSystem= 
     (TextView)itemView.findViewById(R.id.external_system); 
     timeDifference= 
     (TextView)itemView.findViewById(R.id.time_difference); 
     timeCounter=(TextView)itemView.findViewById(R.id.time_counter); 
     type=(TextView)itemView.findViewById(R.id.type); 
    } 

編輯:我想我發現了一種方法,但我不知道這是不是最好的

+1

顯示您的代碼和logcat。 –

+0

添加一些代碼。你應該在'holder.itemView'中找到id的視圖,而不是'RecyclerView'本身。 –

+0

我不認爲我可以檢查持有者的文本更改,我可以在那裏聲明他們並將其綁定。 –

回答

1

該解決方案將涉及改變你的Item類有點。

你的問題是,你沒有正確地將boolean觸發器從Activity正確傳遞到你的RecyclerView.Adapter。例如。 isEndedBoolean的價值,以瞭解該物品的狀態。你有正確的想法在使用所有三個類。

我會建議做的是在你的Item類中創建一個構造函數,將你的Activity中的值傳遞給你的適配器。我覺得使用getterssetters更容易,而不是直接從代碼中分配變量。

因此,讓我們開始,

boolean isEnded; 
    if(!endedAt.equals("null")) { 
    endedAt = endedAt.substring(endedAt.indexOf("T") + 1, endedAt.lastIndexOf(":")); 
    isEnded=true; 
    } else { 
    endedAt="ongoing"; 
    isEnded=false; 
    } 
    String timeDifference = createdAt+" - "+endedAt; 
    if(externalSystem.equals("null")) { 
    externalSystem=""; 
    } else { 
    externalSystem = externalSystem; 
    } 
    Log.i("attr",externalSystem); 
    items.add(new ItemModel(isEnded, timeDifference, externalSystem); 

    itemAdapter=new ItemAdapter(this, items); 
    recyclerView.setAdapter(itemAdapter); 
    itemAdapter.notifyDataSetChanged(); 

你會發現我是如何增加一個新的ItemModel爲的RecyclerView內部變量數組的每一行,然後傳遞數組到Adapter。這樣可以更容易地知道將什麼變量傳遞給模型,並因此知道Adapter內部位置的相應行。

ItemModel類的例子看起來是這樣的:

public class ItemModel { 
    // Getter and Setter model for recycler view items 
    private boolean isEnded; 
    private String timeDifference; 
    private String externalSystem; 
    //other variables, title etc etc 

    public ItemModel(boolean isEnded, String timeDifference, String externalSystem) { 

     this.isEnded = isEnded; 
     this.timeDifference = timeDifference; 
     this.externalSystem = externalSystem; 
     //only pass to the model if you can access it from code above otherwise to assign the variables statically like you have. 
    } 

    public boolean getIsEnded() {return isEnded;} 

    public String getTimeDifference() {return timeDifference;} 

    public String getExternalSystem() { return externalSystem; } 

} 

以上信息只是作爲參考,爲您打造更高效的模型框架來傳遞數據,而不是使用靜態變量。

現在要解決您的問題,您需要檢查if (item.getIsEnded()),然後更改與該if條件對應的文本顏色。

RecyclerView.AdapteronBindViewHolder將如下所示:

@Override 
public void onBindViewHolder(ItemViewHolder holder, int position) { 
    ItemModel item =itemList.get(position); 
    holder.timeDifference.setText(item.getTimeDifference()); 
    holder.title.setText(item.title); 
    holder.timeCounter.setText(item.timeCounter); 
    holder.externalSystem.setText(item.getExternalSystem()); 
    holder.type.setText(item.type); 
    holder.project.setText(item.project); 
    if (item.getIsEnded() { 
    holder.timeDifference.setTextColor(item.color); 
    } else { 
    holder.timeDifference.setTextColor(item.color); 
    } 
} 

Adapter的目的是充氣的佈局,組件綁定到該佈局,並在專用位置對應於所述佈局中的項執行的功能。您需要知道列表中的哪個項目處於哪個狀態,您將無法單獨通過您的Activity來完成。請注意,Adapter將您的Activity的代碼與RecyclerView的實際活動區分開來有多麼有用。

+1

對不起,我週末出去了,但處理我的問題的好方法,非常感謝! –

+0

樂意幫忙。祝你好運。 –

相關問題