【问题标题】:Update ListView items data on horizontal RecyclerView item selected在选中的水平 RecyclerView 项目上更新 ListView 项目数据
【发布时间】:2017-01-25 11:06:44
【问题描述】:

我想在选择水平 RecyclerView 文本视图位置时更新列表项数据。

设置适配器时出现空指针异常,ListView 为空。

我的代码如下:

activity_main.xml:

 <?xml version="1.0" encoding="utf-8"?>

   <RelativeLayout     xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
tools:context=".ChapterList"
android:id="@+id/relativeroot"
android:background="@drawable/bgimage">

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/toolbarbg"
    android:minHeight="?attr/actionBarSize">

    <ImageView
        android:id="@+id/img_back"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/back_white" />

    <Textview
        android:id="@+id/toolbartitle"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:gravity="center"
        android:text="@string/app_name"
        android:textColor="@color/white" />

    <ImageView
        android:id="@+id/img_play"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="end"
        android:layout_marginRight="10dp"
        android:src="@drawable/play" />
</android.support.v7.widget.Toolbar>
<android.support.v7.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="70dp"
    android:layout_marginLeft="80dp"
    android:layout_below="@+id/toolbar"
    android:id="@+id/viewpager">
    </android.support.v7.widget.RecyclerView>

<ListView
    android:id="@+id/list_chapter"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@+id/viewpager"
    android:layout_marginTop="10dp" />

MainActivity.java

         mListView.setAdapter(chapterListItem);
         RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.HORIZONTAL, false);

        mRecyclerView.setLayoutManager(layoutManager);
        mRecyclerView.setAdapter(adapter);

PagerAdaptre.java

      public class PagerAdapter extends 
       RecyclerView.Adapter<PagerAdapter.MyViewHolder> {
        Context context;
        ArrayList<Chapter> arrayList;
         Mainactivity mainactivity;

        public PagerAdapter(Context context, ArrayList<Chapter> arrayList) {
           this.context = context;
           this.arrayList = arrayList;
        }


public class MyViewHolder extends RecyclerView.ViewHolder{
         public TextView textView;
          public ImageView imageView;

          public MyViewHolder(View view){
             super(view);
             textView=(TextView)view.findViewById(R.id.tv_chapter_no);
             imageView=(ImageView)view.findViewById(R.id.img_selected);
               }
           }
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        Viewitemview=LayoutInflater.from(parent.getContext())
        .inflate(R.layout.viewpager_item,parent,false);
    return new MyViewHolder(itemview);
    }

@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {

    final Chapter chapter = arrayList.get(position);
    holder.textView.setText("" + chapter.getChapternumber());
    if (position == 0) {
        holder.imageView.setImageResource(R.drawable.pagination);
    }
    holder.textView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            holder.imageView.setImageResource(R.drawable.pagination);
            mainactivity=new MainActivity();
              mainactivity.setpos
             (Integer.parseInt(""+chapter.getChapternumber()));
        }

    });

}


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

MainActivity.java

void setpos(int position) {

    chapterpos=position;//chappos is int variable
    setlistdata(chapterpos);
}
private void setlistdata(int position){
    namelist.clear();
    chapterListItem=null;
    chapterListItem = new ChapterListItem(ChapterList.this, namelist);
    try {


        chapterListItem.notifyDataSetChanged();
        mListView.setAdapter(chapterListItem);// i am getting 
        listview null here

     } catch (Exception e) {
        e.printStackTrace();
    }
}

我的 Logcat 如下:

01-25 17:11:39.904 26929-26929/com.ex.Appname

W/System.err: java.lang.NullPointerException: 
Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference
01-25 17:11:39.904 26929-26929/
 W/System.err:     at MainActivity.setlistdata(MainActivity.java:625)
01-25 17:11:39.904 26929-26929/

W/System.err:     at MainActivity.setpos(ChapterList.java:581)
01-25 17:11:39.904 26929-26929/

W/System.err:     at PagerAdapter$1.onClick(PagerAdapter.java:61)
01-25 17:11:39.904 26929-26929/

W/System.err:     at android.view.View.performClick(View.java:4783)
01-25 17:11:39.904 26929-26929/

W/System.err:     at android.view.View$PerformClick.run(View.java:19887)
01-25 17:11:39.904 26929-26929/

W/System.err:     at android.os.Handler.handleCallback(Handler.java:739)
01-25 17:11:39.904 26929-26929/

W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
01-25 17:11:39.904 26929-26929/

W/System.err:     at android.os.Looper.loop(Looper.java:135)
01-25 17:11:39.904 26929-26929/

 W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5290)
01-25 17:11:39.904 26929-26929/

W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
01-25 17:11:39.904 26929-26929/

W/System.err:     at java.lang.reflect.Method.invoke(Method.java:372)
01-25 17:11:39.904 26929-26929/

W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:911)
01-25 17:11:39.904 26929-26929/

W/System.err:     atcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:706)

【问题讨论】:

  • 粘贴logcat...
  • 我已经发布了 logcat
  • 创建一个minimal reproducible example。不要发布您的活动代码部分。
  • 不管怎样,recyclerview 有 android:id="@+id/viewpager" 这真的很混乱

标签: java android listview nullpointerexception android-recyclerview


【解决方案1】:

您是否在 MainActivity 中找到了您的列表视图(以 xml 声明)? 包括以下行 -

mListView = (ListView)findViewById(R.id.your_listview_id)

【讨论】:

  • 是的,当 oncreate() 被调用时,listview.setadapter 工作正常,但我再次尝试设置它给我空指针异常的数据
  • 首先尝试在回收器视图适配器的构造函数中传递您的 mListView,然后从该适配器类将其传递给 setPos( (Integer.parseInt(""+chapter.getChapternumber()) ,mlistview) ,然后也将它传递给 setlistdata 像这样 private void setlistdata(int position,ListView mlistview){ // 使用这个 listview 来设置你的适配器。}
  • In private void setlistdata(int position, mListView or ListView listview){ listview.setadapter(chapterListItem); }
  • 当你定义这个使用 setlistdata(int position,ListView listview){} 并且当你调用这个使用 setlistdata(chapterpos,mListView);我希望这很清楚。
【解决方案2】:
private void setlistdata(int position){
    namelist.clear(); // **You are clearing the nameList here, so It might possible you should add new data before use it again.**
    chapterListItem=null;
    chapterListItem = new ChapterListItem(ChapterList.this, namelist);
try {

    chapterListItem.notifyDataSetChanged();
    mListView.setAdapter(chapterListItem);// i am getting 
    listview null here

 } catch (Exception e) {
    e.printStackTrace();
}

}

【讨论】:

  • 您能否详细说明,因为名单的数据已更改,我想重新设置该数据
【解决方案3】:
mainactivity=new MainActivity();

您刚刚创建了一个新 Activity,并且丢失了对您使用 findViewById 的那个的所有引用。

经验法则:永远不要进行new 活动。您需要以不同的方式处理 item selected 事件。理想情况下是从 Activity 中设置,而不是从 Adapter 中设置,以便您可以调用必要的方法

要记住的一点:您将如何“返回”一章?单击后,您会重新加载整个适配器,丢失旧数据,所以我猜您还没有考虑过这一点

【讨论】:

  • 那么我如何根据 recyclerview 项目位置的选择重新加载列表视图?
  • 你需要使用现有的Activity。这就是我要说的。因此,如果您需要覆盖列表数据,您的点击事件需要存在于 Activity 中。 antonioleiva.com/recyclerview-listener
猜你喜欢
  • 2012-05-30
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多