2016-07-20 70 views
2
  • 我在我的应用程序中实现了Recyclerview,我需要在其项目上单击更新另一个listview,这就是为什么我在activity中实现了onClick事件。它工作正常。
  • 但我还需要High Light RecyclerView选定的视图和其他都保持正常。
  • 为此,我使用RecyclerView getChild方法使所有视图正常,然后选择视图突出显示。
  • 我意识到它仅适用于RecyclerView的可见视图。 但我需要使正常的Recyclerview的所有视图,如果我用getChildAt与更大的位置,然后总可见计数它返回空指针异常。
    • 登录,我得到

E /项目排名:29RecyclerView getChildAt(position)返回null

E /项目RV:15

E /儿童适配器:30

MainActivity.java

public class MainActivity extends Activity { 
RecyclerView reView; 
ArrayList<RvModel> rvModels; 
revAdapter adapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    reView = (RecyclerView) findViewById(R.id.reView); 
    reView.setLayoutManager(new GridLayoutManager(MainActivity.this, 3)); 

    rvModels = new ArrayList<>(); 
    adapter = new revAdapter(MainActivity.this, rvModels); 
    reView.setAdapter(adapter); 
    prepareData(); 
    reView.addOnItemTouchListener(new RecyclerItemClickListener(MainActivity.this, reView, new RecyclerItemClickListener.OnItemClickListener() { 
     @Override 
     public void onItemClick(View view, int position) { 
      Log.e("Item Pos", "" + position); 
      Log.e("Item Rv", "" + reView.getChildCount()); 
      Log.e("Child Adapter", "" + reView.getAdapter().getItemCount()); 

      for (int i = 0; i < reView.getChildCount(); i++) { 
       View v = reView.getChildAt(i); 
       TextView txtText = (TextView) v.findViewById(R.id.txtText); 

       txtText.setBackgroundColor(Color.WHITE); 
       txtText.setTextColor(Color.BLUE); 
      } 
      TextView txtText = (TextView) view.findViewById(R.id.txtText); 
      txtText.setBackgroundColor(Color.BLUE); 
      txtText.setTextColor(Color.WHITE); 
     } 

     @Override 
     public void onLongItemClick(View view, int position) { 

     } 
    })); 
} 

private void prepareData() { 
    rvModels.clear(); 
    for (int i = 0; i < 30; i++) { 
     RvModel rvModel = new RvModel(); 
     rvModel.setTitle("Item : " + i); 
     rvModels.add(rvModel); 
    } 
    adapter.notifyDataSetChanged(); 
    } 
} 

revAdapter.java

public class revAdapter extends RecyclerView.Adapter<revAdapter.ViewHolder> { 
Context context; 
ArrayList<RvModel> rvModels; 
LayoutInflater inflater; 

public revAdapter(Context context, ArrayList<RvModel> rvModels) { 
    this.context = context; 
    this.rvModels = rvModels; 
    inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

public class ViewHolder extends RecyclerView.ViewHolder { 
    ImageView ivIcon; 
    TextView txtText; 

    public ViewHolder(View itemView) { 
     super(itemView); 
     ivIcon = (ImageView) itemView.findViewById(R.id.ivIcon); 
     txtText = (TextView) itemView.findViewById(R.id.txtText); 
    } 
} 

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View itemView = inflater.inflate(R.layout.rv_raw, parent, false); 
    return new ViewHolder(itemView); 
} 

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
    RvModel rvModel = rvModels.get(position); 
    holder.txtText.setText(rvModel.getTitle()); 
} 

@Override 
public int getItemCount() { 
    return rvModels.size(); 
} 

@Override 
public int getItemViewType(int position) { 
    return position; 
    } 
} 

rv_raw.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:gravity="center" 
android:orientation="vertical"> 

<LinearLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:padding="10dp"> 

    <ImageView 
     android:id="@+id/ivIcon" 
     android:layout_width="100dp" 
     android:layout_height="100dp" 
     android:src="@mipmap/ic_launcher" /> 

    <TextView 
     android:id="@+id/txtText" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Medium Text" 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 
</LinearLayout> 

回答

4

的问题是,像recyclerView列表视图有子视图数(项目)取决于你的屏幕尺寸,而不是你有多少物品。它可以防止应用程序出现OOM异常。例如,如果您拥有1M项目,那么从您的逻辑来看,回收站视图必须创建1M个子视图,而且这很糟糕。您可以阅读更多关于列表视图here(回收站视图以同样的方式工作)

因此,在您的情况onClick事件中,您不需要查找并更改它。您需要更改一些所谓的“设置”,并写入notifyDataSetChangednotifyItemChanged以获得更多优化。

我也检查过你的代码,我正在求你。请删除此重叠功能:

@Override 
public int getItemViewType(int position) { 
    return position; 
} 

您对所有项目使用相同的支架,因此回收站视图中只有一种类型的视图。以这种方式覆盖此方法,告诉您的回收商视图,每个项目使用不同的布局,这会降低性能。

因此,根据你的问题,你将有某种:

reView.addOnItemTouchListener(new RecyclerItemClickListener(MainActivity.this, reView, new RecyclerItemClickListener.OnItemClickListener() { 
    @Override 
    public void onItemClick(View view, int position) { 
     Log.e("Item Pos", "" + position); 
     Log.e("Item Rv", "" + reView.getChildCount()); 
     Log.e("Child Adapter", "" + reView.getAdapter().getItemCount()); 

     if (!adapter.isChecked(position)) { 
      adapter.setChecked(position); 
     } 
    } 

    @Override 
    public void onLongItemClick(View view, int position) { 

    } 
})); 

适配器:

private int checkedPosition = -1; 

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
    RvModel rvModel = rvModels.get(position); 
    holder.txtText.setText(rvModel.getTitle()); 

    if (position == checkedPosition) { 
     txtText.setBackgroundColor(Color.BLUE); 
     txtText.setTextColor(Color.WHITE); 
    } else { 
     txtText.setBackgroundColor(Color.WHITE); 
     txtText.setTextColor(Color.BLUE); 
    } 
} 

public boolean isChecked(int position) { 
    return checkedPosition == position; 
} 

public void setChecked(int position) { 
    int prevChecked = checkedPosition; 
    checkedPosition = position; 

    if (prevChecked != -1) { 
     notifyItemChanged(prevChecked); 
    } 
    notifyItemChanged(checkedPosition) 
} 
+0

由于很好的解释。我也不想使用getItemViewType方法,但是每当我没有使用它时,Recycler视图在滚动时更新视图,而不是在本例中。它发生在另一个应用程序中,我使用回收查看网格布局。 –

相关问题