Android:如何更新Recycler视图列表中的单个行

时间:2016-02-22 08:20:10

标签: android arrays json listview android-recyclerview

我有一个应用程序,在 500行创建时调用 API 。在我的应用中,行内容可以在详细信息页面中更新。因此,更新后有可能更新 Recycler View 中的行而无需再次调用 API

活动

AsyncHttpClient client = new AsyncHttpClient();
client.get("URL", new AsyncHttpResponseHandler() {
@Override
 public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
try {                        
    String jsonStr = new String(responseBody, "UTF-8");
    if (jsonStr != null) {
    try {  
        JSONArray jsonArray = new JSONArray(jsonStr);
        JSONObject cStatus = jsonArray.getJSONObject(jsonArray.length()-1);
        for (int i = 0; i < jsonArray.length(); i++) 
        {
        JSONObject c = jsonArray.getJSONObject(i);
        String firstName = c.getString("firstName");
        String subDistributerId = c.getString("subDistributerId");
        SubdistributorItem item = new SubdistributorItem();
        item.setSubDistributorName(firstName);
        item.setSubDistributorId(subDistributerId);
        ubdistributorItemList.add(item);
        }
       } catch (JSONException e) {
         e.printStackTrace();
       }
     } 
     Collections.sort(subdistributorItemList, new Comparator<SubdistributorItem>() {
     public int compare(SubdistributorItem o1, SubdistributorItem o2) {
     return o1.getSubDistributorName().compareToIgnoreCase(o2.getSubDistributorName());
    }
   });
    adapter = new SubdistributorRecyclerAdapter(getActivity(),subdistributorItemList);
     mRecyclerView.setAdapter(adapter);
  } catch (UnsupportedEncodingException e) {
   e.printStackTrace();
   }
  }               
});

适配器类

public class SubdistributorRecyclerAdapter extends RecyclerView.Adapter<SubdistributorListRowHolder>  {
private List<SubdistributorItem> subdistributorItems;
private Context mContext;
private ArrayList<SubdistributorItem> arraylist;

public SubdistributorRecyclerAdapter(Context context, List<SubdistributorItem> subdistributorItems) {
    this.subdistributorItems = subdistributorItems;
    this.mContext = context;
    this.arraylist = new ArrayList<SubdistributorItem>();
    this.arraylist.addAll(subdistributorItems);
}

@Override
public SubdistributorListRowHolder onCreateViewHolder(ViewGroup viewGroup,  int i) {
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.subdistributor_list_item, null);
    SubdistributorListRowHolder mh = new SubdistributorListRowHolder(v);

    layout_subdistributor.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(final View v) {
      Intent i = new Intent(mContext, SubdistributorDetail.class);
                    Log.e("Tag shop ", "ShopKeeper Detail called");
                    i.putExtra("subDistributorStatus", txt_RechargeSubdistributor.getText().toString());
                    i.putExtra("subDistributorId", txt_subDistributorId.getText().toString());
                    mContext.startActivity(i);

        }
    });
    return mh;
}
@Override
public void onBindViewHolder(SubdistributorListRowHolder subDistributorListRowHolder, int i) {

    SubdistributorItem subdistributorItem = subdistributorItems.get(i);
    Log.e("Tag ", "adapter "+ subdistributorItem.getSubDistributorName());

}
@Override
public int getItemCount() {
    return (null != subdistributorItems ? subdistributorItems.size() : 0);
}
}

所以任何人都可以帮我更新列表中的单行,而无需再次调用API。

5 个答案:

答案 0 :(得分:2)

尝试使用此方法更新单行。

notifyItemChanged(int position)

答案 1 :(得分:1)

更改此

public static class SubdistributorListRowHolder extends RecyclerView.ViewHolder {

    private TextView textView_alphabet;
    private TextView textView_name;
    private TextView textView_tag;
    private ImageView imageViewUserImage;
    private ImageView imageViewMoreButton;
    private LinearLayout linearLayoutMainContent;

    public ViewHolder(View itemLayoutView) {
        super(itemLayoutView);
        textView_alphabet = (TextView) itemLayoutView.findViewById(R.id.textView_alphabet);
        textView_name = (TextView) itemLayoutView.findViewById(R.id.textView_name);
        textView_tag = (TextView) itemLayoutView.findViewById(R.id.textView_tag);
        imageViewUserImage = (ImageView) itemLayoutView.findViewById(R.id.imageViewUserImage);
        linearLayoutMainContent = (LinearLayout) itemLayoutView.findViewById(R.id.linearLayoutMainContent);
    }
}

 @Override
 public void onBindViewHolder(SubdistributorListRowHolder subDistributorListRowHolder, int i) {

 SubdistributorItem subdistributorItem = subdistributorItems.get(i);
 Log.e("Tag ", "adapter "+ subdistributorItem.getSubDistributorName());
 subDistributorListRowHolder.itemLayoutView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.e("Tag ", "Position "+ i);
        }
    });
 }

此处itemLayoutView是可点击的邮件布局 像这样修改SubdistributorListRowHolder放置所有布局组件并按id查找视图。

答案 2 :(得分:1)

更新列表subdistributorItems中的项目。然后拨打adapter.notifyItemChanged(int position)。您可以使用

在ClickListener中获得一个职位
layout_subdistributor.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(final View v) {
        if (mh.getAdapterPosition() != RecyclerView.NO_POSITION) {
          int position = mh.getAdapterPosition();
          // edit your object by calling subdistributorItems.get(position)
        }
    }
});

答案 3 :(得分:0)

简单。 在与Recycler视图绑定的ArrayList中进行更改,并在Recycler View上调用notifyDataSetChanged()。

答案 4 :(得分:0)

getViewForPosition(int position) 

获取为给定位置初始化的视图。 RecyclerView.LayoutManager实现应该使用此方法来获取视图以表示来自RecyclerView.Adapter的数据。

如果可以使用正确的视图类型,则Recycler可以重用共享池中的剪贴图或分离视图。如果适配器未指示给定位置的数据已更改,则Recycler将尝试回送先前为该数据初始化的报废视图,而不进行重新绑定。 description here