onItemClicklistener();不适用于android中的自定义listView

时间:2012-11-27 12:01:23

标签: android listview onitemclicklistener custom-lists

我有一个自定义listView.xml,其listView为。

    <?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"
    android:background="@null" >

    <ListView
        android:id="@+id/searchList"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/txtSearchFor"
        android:background="@color/Black" >
    </ListView>

</RelativeLayout>

此listview包含一个ImageView,2个TextViews和一个RatingBar(item_list.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" >
    <RelativeLayout
        android:id="@+id/rel_SearchLayout01"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true" >

        <ImageView
            android:id="@+id/img_searchBookCoverPhoto"
            android:layout_width="70dp"
            android:layout_height="100dp"
            android:layout_margin="5dp"
            android:background="@drawable/rounded_image_borders"
            android:focusable="false"
            android:src="@drawable/book1" />

        <TextView
            android:id="@+id/txt_searchBookTitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignTop="@+id/img_searchBookCoverPhoto"
            android:layout_marginTop="10dp"
            android:layout_toRightOf="@+id/img_searchBookCoverPhoto"
            android:focusable="false"
            android:text="The Basic Doctrine Of Islam"
            android:textColor="@color/White"
            android:textSize="16sp" />

        <TextView
            android:id="@+id/txt_searchAutherName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/txt_searchBookTitle"
            android:layout_marginTop="2dp"
            android:layout_toRightOf="@+id/img_searchBookCoverPhoto"
            android:focusable="false"
            android:text="By: Andrew J Newman"
            android:textColor="@color/SkyBlue"
            android:textSize="14sp" />

        <RatingBar
            android:id="@+id/searchRatingbar"
            style="?android:attr/ratingBarStyleSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/txt_searchAutherName"
            android:layout_marginTop="12dp"
            android:layout_toRightOf="@+id/img_searchBookCoverPhoto"
            android:focusable="false"
            android:isIndicator="false"
            android:numStars="5"
            android:rating="5"
            android:stepSize="1" />
    </RelativeLayout>

</RelativeLayout>
  • 我的问题是我有Listview的点击事件,如下所示

enter image description here

但它不起作用,我真的很惊讶,为什么会发生这种情况

你可以看到我也设置了这个

android:focusable="false"

用于我的自定义listView中的所有视图。

这里也是自定义适配器的代码。

public class BookSearchResultActivity extends Activity {

    static final String URL = "http://www.shiaislamiclibrary.com/requesthandler.ashx";
    static final String KEY_ITEM = "Book"; // parent node
    static final String KEY_BOOKAUTHOR = "BookAuthor";
    static final String KEY_BOOKTITLE = "BookTitle";
    static final String KEY_BOOKCODE = "BookCode";
    static final String KEY_BOOKIMAGE = "BookImage";

    ArrayList<String> BookTitle = new ArrayList<String>();
    ArrayList<String> BookCoverPhotos = new ArrayList<String>();
    ArrayList<String> BookAuther = new ArrayList<String>();
    ArrayList<String> ImageByte = new ArrayList<String>();
    ArrayList<Bitmap> bitmapArray = new ArrayList<Bitmap>();

    ListView lv;
    ListView listView;
    Activity act = this;

    LayoutInflater inflater = null;

    TextView txtSearchedKeywords;
    TextView txtSearchFor;
    TextView txtBooksCount;
    String keyWordsSearch;
    String language;

    URL bookImageURL = null;
    Bitmap bitMapImage = null;
    Context context = BookSearchResultActivity.this;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.book_search_layout);

        txtSearchedKeywords = (TextView) findViewById(R.id.txtKeyWordSearched);
        txtSearchFor = (TextView) findViewById(R.id.txtSearchFor);
        txtBooksCount = (TextView) findViewById(R.id.txtNmbrOfBooksFound);
        listView = (ListView) findViewById(R.id.searchList);

        Intent getInfoIntent = getIntent();
        keyWordsSearch = getInfoIntent.getStringExtra("SEARCH_KEYWORDS");
        language = getInfoIntent.getStringExtra("LANG");

        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        // checking for availbe internet Connection
        if (cm.getActiveNetworkInfo() != null
                && cm.getActiveNetworkInfo().isAvailable()
                && cm.getActiveNetworkInfo().isConnected()) {

            new UIThread().execute(URL, keyWordsSearch, language);

        }

        listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int pos,
                    long arg3) {
                Toast.makeText(context, BookTitle.get(pos).toString(),
                        Toast.LENGTH_SHORT).show();
            }
        });
    }

    private class UIThread extends AsyncTask<String, Integer, String> {

        ProgressDialog progressDialog;

        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
            progressDialog = ProgressDialog.show(getParent(),
                    "Search in Progress...",
                    "This may Take a few seconds.\nPlease Wait...");

            txtSearchFor.setText("Searching in Progress...!");
            txtBooksCount.setVisibility(View.INVISIBLE);

        }

        @Override
        protected String doInBackground(String... params) {

            String URL = params[0];
            String searchKeywords = params[1];

            XMLParser parser = new XMLParser();
            String XMLString = parser.getXmlFromUrl(URL, searchKeywords,
                    language);
            // Log.i("XML Response", XMLString);

            Document doc = parser.getDomElement(XMLString);

            NodeList nl = doc.getElementsByTagName(KEY_ITEM);

            // looping through all item nodes <item>
            for (int i = 0; i < nl.getLength(); i++) {
                Element e = (Element) nl.item(i);

                BookTitle.add(parser.getValue(e, KEY_BOOKTITLE));
                BookCoverPhotos.add("http://shiaislamicbooks.com/books_Snaps/"
                        + parser.getValue(e, KEY_BOOKCODE) + "/1_thumb.jpg");
                BookAuther.add(parser.getValue(e, KEY_BOOKAUTHOR));
                Log.i("URLs", BookCoverPhotos.toString());
            }
            for (int i = 0; i < BookAuther.size(); i++) {

                try {
                    bookImageURL = new URL(BookCoverPhotos.get(i));
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                    Log.i("URL", "ERROR at image position" + i + "");
                }

                try {
                    bitMapImage = BitmapFactory.decodeStream(bookImageURL
                            .openConnection().getInputStream());
                    bitmapArray.add(bitMapImage);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    Log.i("BITMAP", "ERROR" + i);
                }
            }
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);

            progressDialog.dismiss();
            txtSearchFor.setText("Results For");
            txtSearchedKeywords.setText("\"" + keyWordsSearch + "\"");
            txtBooksCount.setVisibility(View.VISIBLE);
            txtBooksCount.setText(bitmapArray.size() + " Book(s) found");
            ImageAdapter adapter = new ImageAdapter(getBaseContext(), act);
            listView.setAdapter(adapter);

        }

    }

    public class ImageAdapter extends BaseAdapter {

        public ImageAdapter(Context c) {
            context = c;
        }

        // ---returns the number of images---
        public int getCount() {
            return bitmapArray.size();
        }

        public ImageAdapter(Context ctx, Activity act) {
            inflater = (LayoutInflater) act
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }

        // ---returns the ID of an item---
        public Object getItem(int position) {
            return position;
        }

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

        // ---returns an ImageView view---
        public View getView(int position, View convertView, ViewGroup parent) {

            // ImageView bmImage;

            final ViewHolder holder;
            View vi = convertView;
            if (convertView == null) {
                vi = inflater.inflate(R.layout.list_style, parent, false);
                holder = new ViewHolder();
                holder.txt_BooksTitle = (TextView) vi
                        .findViewById(R.id.txt_searchBookTitle);

                holder.img_BookCoverPhoto = (ImageView) vi
                        .findViewById(R.id.img_searchBookCoverPhoto);
                holder.txt_BooksAuthor = (TextView) vi
                        .findViewById(R.id.txt_searchAutherName);

                holder.ratingBar = (RatingBar) vi
                        .findViewById(R.id.searchRatingbar);

                vi.setTag(holder);
            } else {

                holder = (ViewHolder) vi.getTag();
            }
            holder.txt_BooksTitle.setText(BookTitle.get(position) + "");
            holder.img_BookCoverPhoto.setImageBitmap(bitmapArray.get(position));
            holder.txt_BooksAuthor.setText(BookAuther.get(position) + "");
            holder.ratingBar.setRating(3);
            return vi;
        }
    }

    class ViewHolder {
        TextView txt_BooksTitle;
        TextView txt_BooksAuthor;
        ImageView img_BookCoverPhoto;
        RatingBar ratingBar;
    }
}

6 个答案:

答案 0 :(得分:1)

您可以在getView() ConvertView中使用OnclickListener实施convertView.(new View.OnClickListener(){ @Override public void onClick(View view) { //write your code here } }); 之类的其他替代方案

public View getView(final int position, View convertView, ViewGroup parent)
    {

            if(convertView == null) /* Create a new row view */
            {
                convertView = inflater.inflate(R.layout.simplerow, null);
            }

        convertView.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    //your implementation.
                }
            }


    }

请告诉我这个替代方案是否正常

{{1}}

答案 1 :(得分:1)

请更新以下item_list.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" >

    <RelativeLayout
        android:id="@+id/rel_SearchLayout01"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true" >

        <ImageView
            android:id="@+id/img_searchBookCoverPhoto"
            android:layout_width="70dp"
            android:layout_height="100dp"
            android:layout_margin="5dp"
            android:src="@drawable/ic_launcher" />

        <TextView
            android:id="@+id/txt_searchBookTitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignTop="@+id/img_searchBookCoverPhoto"
            android:layout_marginTop="10dp"
            android:layout_toRightOf="@+id/img_searchBookCoverPhoto"
            android:text="The Basic Doctrine Of Islam"
            android:textSize="16sp" />

        <TextView
            android:id="@+id/txt_searchAutherName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/txt_searchBookTitle"
            android:layout_marginTop="2dp"
            android:layout_toRightOf="@+id/img_searchBookCoverPhoto"
            android:text="By: Andrew J Newman"
            android:textSize="14sp" />

        <RatingBar
            android:id="@+id/searchRatingbar"
            style="?android:attr/ratingBarStyleSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/txt_searchAutherName"
            android:layout_marginTop="12dp"
            android:layout_toRightOf="@+id/img_searchBookCoverPhoto"
            android:numStars="5"
            android:rating="5"
            android:stepSize="1" />
    </RelativeLayout>

</RelativeLayout>

答案 2 :(得分:0)

This可能适合您。

如果您想为不同的视图组件使用不同的侦听器,那么请执行此操作

sqView.ticker.setOnClickListener(new OnClickListener(){

                    @Override
                    public void onClick(View view) {
                        // TODO Auto-generated method stub
//write your code here
}
});

答案 3 :(得分:0)

添加两者 机器人:可点击=“假” 机器人:可聚焦= “假”

在item_list.XML

我认为问题会解决

答案 4 :(得分:0)

在您的主Activity类中实现OnItemClickListener。

public class BookSearchResultActivity extends Activity implement OnItemClickListener {

//now implement unimplemented methods 
//and 
listView.setOnItemClickListener(this);
}

我希望,这会对你有所帮助。

答案 5 :(得分:-1)

在自定义ListView

中的所有窗口小部件的xml文件中进行虚拟可点击和可聚焦