【问题标题】:Select an item inside listview adapter android在listview适配器android中选择一个项目
【发布时间】:2013-04-10 10:31:34
【问题描述】:

在我的主要活动中,我调用了一个对象,编写了一个方法 itemClicked()。

public void itemClicked(){

        System.out.println("Clicked");
        efficienadapter.notifyDataSetChanged();
    }

当我从列表视图中选择一行时,我正在尝试打印 Clicked 项目。注意:我正在使用一个名为 EfficientAdapter 的列表适配器。

这是适配器:

     public class EfficientAdapter extends BaseAdapter {



            private Activity activity;
            private ArrayList<ComptePost> data;
            private static LayoutInflater inflater = null;
            public ImageLoader imageLoader; 
            public  Boolean isActusAstuce;
            public static int flag = 0, counter=0;
            NVirementEmmeteur main;
            int num=0;

            ViewHolder holder;
            static String src;

            public EfficientAdapter(Activity a, ArrayList<ComptePost> d) {


                activity = a;
                data = d;
                inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            //  imageLoader = new ImageLoader(activity.getApplicationContext());
                imageLoader=new ImageLoader(activity.getApplicationContext());
            }

            public EfficientAdapter(NVirementEmmeteur m) {
                main=m;
            }

            @Override
            public int getCount() {
                return data.toArray().length;

            }

            @Override
            public Object getItem(int position) {

                return position;
            }

            @Override
            public long getItemId(int position) {
                return position;
            }

            public static class ViewHolder {

                public TextView one;
                public TextView two;
                public TextView three;
                public ImageView image;
                        public RelativeLayout relative;
            }

            @Override
            public View getView(final int position, View convertView, ViewGroup parent) {
                View vi = convertView;



                if (convertView == null) {

                    vi = inflater.inflate(R.layout.single_item, null);
                    holder = new ViewHolder();
                    holder.one = (TextView) vi.findViewById(R.id.text_view_one);
                    holder.image = (ImageView)vi.findViewById(R.id.imageView1);
                    holder.relative = (Relativelayout)vi.findViewById(R.id.relative);
vi.setTag(holder);

                } else
                    holder = (ViewHolder) vi.getTag();

                    holder.one.setTextColor(Color.WHITE);
                    holder.one.setText("Compte No."+data.get(position).getNumComtpe());
                    holder.image.setVisibility(View.GONE);


                    holder.relative_layout.setOnClickListener(new OnClickListener(){

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub

            v.findViewById(R.id.imageView1).setVisibility(View.VISIBLE);

                    main.itemClicked();

                }

            });


                    //flag=0; only first row become white


                return vi;
            }


i used main.itemClicked() to print "Clicked". 


        holder.relative_layout.setOnClickListener(new OnClickListener(){

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub

                    v.findViewById(R.id.imageView1).setVisibility(View.VISIBLE);

                    main.itemClicked();

                }

            });

但是当我选择一个行项目时,我得到了这个错误。

04-10 14:21:43.832: W/dalvikvm(4985): threadid=1: thread exiting with uncaught exception (group=0x40015578)
04-10 14:21:43.847: E/AndroidRuntime(4985): FATAL EXCEPTION: main
04-10 14:21:43.847: E/AndroidRuntime(4985): java.lang.NullPointerException
04-10 14:21:43.847: E/AndroidRuntime(4985):     at .EfficientAdapter$1.onClick(EfficientAdapter.java:111)
04-10 14:21:43.847: E/AndroidRuntime(4985):     at android.view.View.performClick(View.java:2538)
04-10 14:21:43.847: E/AndroidRuntime(4985):     at android.view.View$PerformClick.run(View.java:9152)
04-10 14:21:43.847: E/AndroidRuntime(4985):     at android.os.Handler.handleCallback(Handler.java:587)
04-10 14:21:43.847: E/AndroidRuntime(4985):     at android.os.Handler.dispatchMessage(Handler.java:92)
04-10 14:21:43.847: E/AndroidRuntime(4985):     at android.os.Looper.loop(Looper.java:130)
04-10 14:21:43.847: E/AndroidRuntime(4985):     at android.app.ActivityThread.main(ActivityThread.java:3687)
04-10 14:21:43.847: E/AndroidRuntime(4985):     at java.lang.reflect.Method.invokeNative(Native Method)
04-10 14:21:43.847: E/AndroidRuntime(4985):     at java.lang.reflect.Method.invoke(Method.java:507)
04-10 14:21:43.847: E/AndroidRuntime(4985):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
04-10 14:21:43.847: E/AndroidRuntime(4985):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
04-10 14:21:43.847: E/AndroidRuntime(4985):     at dalvik.system.NativeStart.main(Native Method)

我错在哪里了?

【问题讨论】:

  • 不是我要找的:(
  • 不,我认为我的构造函数是有罪的“NVirementEmmeteur main;”
  • 你已经在 vi 上添加了 click listnet,意思是在 convertView 上使用 itemclick 来处理我上面给出的不同项目,或者使用 R.layout.single_item 中的 perent layout click。如果您有线性布局,请使用 linearlayout.onitemclick ....
  • 你能举个例子吗,我不明白
  • 你已经检查过了----> stackoverflow.com/a/12813906/1168654 如果是,那么我已经为每个列表项添加了 holder.button.setOnClickListener。在您的代码中,您试图单击代码中的 vi 视图。在我的示例中,在LinearLayout中插入该放置项单击,而在行文件中您必须这样做..

标签: android android-listview nullpointerexception onitemclicklistener


【解决方案1】:

在这种情况下,您不应该使用 setOnItemClickListener 吗?如果是,请将其放入您的 ListView。

listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        view.setVisibility(View.VISIBLE);
        MainActivity.itemClicked();
    }
});

【讨论】:

    【解决方案2】:

    这里是如何从列表视图中隐藏图像的简单示例。先试着理解这段代码,然后修改你的代码。

    我有带有文本和图像的列表视图。

    这里是列表视图my_spinner_style.xml的行文件。

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="center"
        android:orientation="horizontal"
        android:weightSum="2" >
    
        <TextView
            android:id="@+id/textView1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Large Text"
            android:textAppearance="?android:attr/textAppearanceLarge" />
    
        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:src="@drawable/ic_launcher" />
    
    </LinearLayout>
    

    我的活动课:

    package com.example.testapp;
    
    import android.app.ListActivity;
    import android.content.Context;
    import android.os.Bundle;
    import android.text.Html;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    public class MainActivity extends ListActivity {
    
        private static final String[] COUNTRIES = new String[] { "Belgium",
                "France", "Italy" };
    
        private static final Integer[] img = new Integer[] {
                R.drawable.ic_launcher, R.drawable.dhaval1, R.drawable.ic_launcher };
    
        private MyArrayAdapter adapter;
        Bundle savedInstanceState;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            setContentView(R.layout.activity_main);
    
            adapter = new MyArrayAdapter(MainActivity.this);
            getListView().setAdapter(adapter);
    
        }
    
        private class MyArrayAdapter extends BaseAdapter {
    
            private LayoutInflater mInflater;
    
            public MyArrayAdapter(Context con) {
                // TODO Auto-generated constructor stub
                mInflater = LayoutInflater.from(con);
            }
    
            @Override
            public int getCount() {
                // TODO Auto-generated method stub
                return COUNTRIES.length;
            }
    
            @Override
            public Object getItem(int position) {
                // TODO Auto-generated method stub
                return position;
            }
    
            @Override
            public long getItemId(int position) {
                // TODO Auto-generated method stub
                return position;
            }
    
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                // TODO Auto-generated method stub
                final ListContent holder;
                View v = convertView;
                if (v == null) {
                    v = mInflater.inflate(R.layout.my_spinner_style, null);
                    holder = new ListContent();
    
                    holder.name = (TextView) v.findViewById(R.id.textView1);
    
                    holder.name2 = (ImageView) v.findViewById(R.id.imageView1);
    
                    v.setTag(holder);
                } else {
    
                    holder = (ListContent) v.getTag();
                }
    
                holder.name.setText("" + Html.fromHtml("" + COUNTRIES[position]));
    
                holder.name2.setImageDrawable(getResources().getDrawable(
                        img[position]));
                holder.name.setOnClickListener(mOnTitleClickListener3);
    
                return v;
            }
    
        }
    
        static class ListContent {
    
            TextView name;
    
            ImageView name2;
    
        }
    
        public OnClickListener mOnTitleClickListener3 = new OnClickListener() {
            public void onClick(View v) {
                final int position = getListView().getPositionForView(
                        (View) v.getParent());
    
                View rowView = getListView().getChildAt(position);
                if (rowView != null) { // do whatever you want here
                    View mainv = ((ViewGroup) rowView).getChildAt(1);
                    Log.e("select dd--->", "" + mainv);
    
                    // hide Image from here....
                    mainv.setVisibility(View.GONE);
                }
    
            }
        };
    
        protected void onRestart() {
            // adapter.notifyDataSetChanged();
            onCreate(savedInstanceState);
        };
    
    }
    

    我在TextView 上添加了OnClickListener,你可以使用你的perent 布局。我的情况是LinearLayout

    【讨论】:

    • 我在我的主要活动中使用它 public static OnClickListener compte_emmetteur_clicked = new OnClickListener() { public void onClick(View v) { final int position = lv1.getPositionForView((View) v.getParent()) ; EfficientAdapter.ViewHolder.image.setVisibility(View.VISIBLE); image_compte_emmeteur.setBackgroundResource(R.drawable.virement_compte_emmeteur_gris); Log.d("你点击的是 Ratings", PostList.get(position).getNumComtpe()); } };
    • 我想将第一个示例改编为我的代码,而不是改变一切,伙计。我用你给出的第一个例子找到了一条好路。只需要知道如何将图像设置为对选定行可见。但我会把你的答案标记为正确答案,因为你帮了我很多
    • @yakusha: 这种类型的东西效果不佳.. 只是为了让我在这里添加这个...... /跨度>
    • 是的,但它给出了一个解决方案,并在某些情况下给了我预期的结果
    【解决方案3】:

    我怀疑这是在这里发生的:

    @Override
    public void onClick(View v) {
        System.out.println("Clicked "+data.get(position).getDebitMin());
        v.findViewById(R.id.imageView1).setVisibility(View.VISIBLE);
        main.itemClicked();
    }
    

    错误发生在第 111 行,这意味着发生了以下三个选项之一:
    1. 数据是 null 或 data.getpositionnull
    2. 你的视图在下一行找到返回null
    3. main 是null

    【讨论】:

    • 但是如果我只是打印一个默认值,点击的项目怎么可能是空的。是我的构造函数错了吗:O
    • 你在构造函数中传递了null
    • 如果你调用第一个构造函数,你应该创建一个NVirementEmmeteur,因为你没有这样做,我假设你应该有一个main = new NVirementEmmeteur()的行
    • 我省略了这一行:O 现在可以工作了,谢谢你,现在一切都好 :) 谢谢你
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多