0
我用CardView製作了一個RecyclerView。 CardView包含一個TextView和ListView。 TextView很好地回收,但ListView的項目與我放在最後的項目完全相同。我怎樣才能解決這個問題?RecyclerView中的ListView不回收
- 我使用自定義列表視圖來修復問題CardView不會傳播整個listView項目。
這是我的代碼。
recyclerview adapter:
public class NoticeAdapter extends RecyclerView.Adapter<NoticeAdapter.NoticeViewHolder>{
private ArrayList<String> noticeTypes;
private ArrayList<ArrayList<String>> noticeTitles;
private ArrayList<ArrayList<String>> noticeDates;
public NoticeAdapter() {
noticeTypes = new ArrayList<>();
noticeTitles = new ArrayList<ArrayList<String>>();
noticeDates = new ArrayList<ArrayList<String>>();
}
public void addNoticeSet(String noticeType, ArrayList<String> noticeTitle, ArrayList<String> noticeDate) {
noticeTypes.add(noticeType);
noticeTitles.add(noticeTitle);
noticeDates.add(noticeDate);
}
@Override
public NoticeViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.notice_row, viewGroup, false);
return new NoticeViewHolder(itemView);
}
@Override
public void onBindViewHolder(NoticeViewHolder noticeViewHolder, int i) {
NoticeListAdapter noticeListAdapter = new NoticeListAdapter();
noticeViewHolder.lv_noticeList.setAdapter(noticeListAdapter);
String noticeType = noticeTypes.get(i);
noticeViewHolder.tv_noticeType.setText(noticeType);
noticeViewHolder.tv_noticeType.setPaintFlags(noticeViewHolder.tv_noticeType.getPaintFlags() | Paint.FAKE_BOLD_TEXT_FLAG);
for(int m=0; m<5; m++)
noticeListAdapter.addNoticeSet(noticeTitles.get(i).get(m),noticeDates.get(i).get(m));
}
@Override
public int getItemCount() {
return noticeTypes.size();
}
public static class NoticeViewHolder extends RecyclerView.ViewHolder {
protected TextView tv_noticeType;
protected NoticeListView lv_noticeList;
public NoticeViewHolder(View itemView) {
super(itemView);
tv_noticeType = (TextView)itemView.findViewById(R.id.tv_noticeType);
lv_noticeList = (NoticeListView)itemView.findViewById(R.id.lv_noticeList);
}
}
}
自定義列表視圖適配器:
public class NoticeListAdapter extends BaseAdapter {
private ArrayList<String> noticeTitles;
private ArrayList<String> noticeDates;
public NoticeListAdapter() {
noticeTitles = new ArrayList<>();
noticeDates = new ArrayList<>();
}
public void addNoticeSet(String noticeTitle, String noticeDate) {
noticeTitles.add(noticeTitle);
noticeDates.add(noticeDate);
}
@Override
public int getCount() {
return noticeTitles.size();
}
@Override
public HashMap<String, String> getItem(int position) {
HashMap<String, String> noticeSet = new HashMap<>();
noticeSet.put(noticeTitles.get(position), noticeDates.get(position));
return noticeSet;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final int pos = position;
final Context context = parent.getContext();
View v = convertView;
if(v == null) {
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(R.layout.noticelist_row, parent, false);
TextView noticeTitle = (TextView)v.findViewById(R.id.tv_noticeTitle);
TextView noticeDate = (TextView)v.findViewById(R.id.tv_noticeDate);
noticeTitle.setText(noticeTitles.get(position));
noticeDate.setText(noticeDates.get(position));
}
return v;
}
}
自定義列表視圖:
public class NoticeListView extends ListView {
public NoticeListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public NoticeListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public NoticeListView(Context context) {
super(context);
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}
cardview XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/cv_notice"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="5dip"
android:layout_gravity="center"
card_view:cardCornerRadius="4dip">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="10dp">
<TextView
android:id="@+id/tv_noticeType"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dip" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.rb16.mainpage.NoticeListView
android:id="@+id/lv_noticeList"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:footerDividersEnabled="false"
android:overScrollFooter="@android:color/transparent"/>
</LinearLayout>
</LinearLayout>
</android.support.v7.widget.CardView>
</LinearLayout>
我怎麼把itmes在主要活動:
private void setNoticeCard() {
//noticeTitle = new ArrayList<String>();
//noticeDate = new ArrayList<String>();
//noticeAdapter = NoticeAdapter();
noticeTitle.add("1");
noticeTitle.add("1");
noticeTitle.add("1");
noticeTitle.add("1");
noticeTitle.add("1");
noticeDate.add("2015-05-31");
noticeDate.add("2015-05-32");
noticeDate.add("2015-05-33");
noticeDate.add("2015-05-34");
noticeDate.add("2015-05-35");
noticeAdapter.addNoticeSet("Notice1", noticeTitle, noticeDate);
noticeTitle.clear();
noticeDate.clear();
noticeTitle.add("2");
noticeTitle.add("2");
noticeTitle.add("2");
noticeTitle.add("2");
noticeTitle.add("2");
noticeDate.add("2016-07-08");
noticeDate.add("2015-05-30");
noticeDate.add("2015-05-30");
noticeDate.add("2015-05-30");
noticeDate.add("2015-05-30");
noticeAdapter.addNoticeSet("Notice2", noticeTitle, noticeDate);
noticeTitle.clear();
noticeDate.clear();
noticeTitle.add("3");
noticeTitle.add("3");
noticeTitle.add("3");
noticeTitle.add("3");
noticeTitle.add("3");
noticeDate.add("2015-05-30");
noticeDate.add("2015-05-30");
noticeDate.add("2015-05-30");
noticeDate.add("2015-05-30");
noticeDate.add("2015-05-30");
noticeAdapter.addNoticeSet("Notice3", noticeTitle, noticeDate);
}
非常感謝!它效果不錯 –
其我的榮幸.. –