2013-03-12 6 views
17

के साथ ListView में आइटम्स पर क्लिक नहीं कर सकता मैं एक ऐसा एप्लिकेशन लिखने की कोशिश कर रहा हूं जो डेटाबेस से आइटम लेता है और सूची दृश्य में पंक्तियों को पॉप्युलेट करता है। मैं पंक्तियों पर टैप करने के बाद आइटम पर क्लिक नहीं कर सकता हूं और डीपीएड किसी भी पंक्ति में नहीं जायेगा। मैं एक कस्टम एडाप्टर का उपयोग कर रहा हूँ।कस्टम एडाप्टर

Tweet.xml

<?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="?android:attr/listPreferredItemHeight" 
     android:padding="6dip" 
     android:orientation="vertical"> 

     <LinearLayout 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:orientation="horizontal" > 

      <TextView 
       android:id="@+id/textUser" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:textStyle="bold" 
       android:text="NAME"/> 

      <TextView 
       android:id="@+id/textDate" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:textColor="#333333" 
       android:text="DATE" /> 

     </LinearLayout> 

     <TextView 
      android:id="@+id/textTweet" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="TWEET" /> 

    </LinearLayout> 

Activity_main.xml

<?xml version="1.0" encoding="UTF-8"?> 
<ListView xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/listView" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentTop="true" 
    tools:context=".MainActivity" > 

</ListView> 

onCreate विधि

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 
      ListView view = (ListView) findViewById(R.id.listView);  
     MyArrayAdapter theAdapter = new MyArrayAdapter(tweetDb,this); 

     //setContentView(theAdapter.getView(0, null, null)); 
     view.setAdapter(theAdapter); 
     view.setOnItemClickListener(new OnItemClickListener() 
     { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View v, int position, 
        long id) 
      { 
       //Tweet theTweet = (Tweet)parent.getAdapter().getItem(position); 
       //saved.insert(theTweet); 
       Toast.makeText(getApplicationContext(), "Saved", Toast.LENGTH_LONG).show(); 
       Log.v("SCHEMA", "onItemClick fired!"); 
      } 
     }); 
    } 

एडाप्टर कक्षा getView

@Override 
public View getView(int position, View convertView, ViewGroup parent) 
{ 
    LayoutInflater inflater = (LayoutInflater)context.getSystemService(
    Context.LAYOUT_INFLATER_SERVICE 
    ); 

    View tweetView = inflater.inflate(R.layout.tweet, null); 

    TextView textTweet = (TextView) tweetView.findViewById(R.id.textTweet);  
    textTweet.setText(items.get(position).getTweet()); 

    textTweet = (TextView)tweetView.findViewById(R.id.textUser); 
    textTweet.setText(items.get(position).getName()); 

    textTweet = (TextView)tweetView.findViewById(R.id.textDate); 
    textTweet.setText(textFormat.format(items.get(position).getCreated())); 

    return tweetView; 
} 

MyArrayAdapter कक्षा

import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.Date; 

import android.content.Context; 
import android.database.Cursor; 
import android.database.DataSetObserver; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.ListAdapter; 
import android.widget.TextView; 
import android.widget.Toast; 

public class MyArrayAdapter implements ListAdapter 
{ 

    private ArrayList<Tweet> items; 
    private Context context; 
    private SimpleDateFormat textFormat = new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy"); 

    public MyArrayAdapter(TweetDbSource db, Context context) 
    { 
     items = new ArrayList<Tweet>(); 
     this.context = context; 
     Cursor cursor = db.getReadableDatabase().query("Tweet", null, null, null, null, null, null); 

     while (!cursor.isLast()) 
     { 
       cursor.moveToNext(); 
       items.add(new Tweet(cursor.getLong(0),cursor.getLong(1),cursor.getString(2),cursor.getString(3), 
           cursor.getString(4),new Date(),cursor.getInt(6))); 
     } 
    } 

    @Override 
    public int getCount() 
    { 
     return items.size(); 
    } 

    @Override 
    public Object getItem(int position) 
    { 
     return items.get(position); 
    } 

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

    @Override 
    public int getItemViewType(int arg0) 
    { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     LayoutInflater inflater = (LayoutInflater)context.getSystemService(
     Context.LAYOUT_INFLATER_SERVICE 
     ); 

     OnClickListener saveTweet = new OnClickListener() 
     { 
       public void onClick(View v) 
       { 
        Toast.makeText(v.getContext(), "Saved", Toast.LENGTH_LONG).show(); 
       } 
     }; 
     View tweetView = inflater.inflate(R.layout.tweet, null); 

     TextView textTweet = (TextView) tweetView.findViewById(R.id.textTweet);  
     textTweet.setText(items.get(position).getTweet()); 

     textTweet = (TextView)tweetView.findViewById(R.id.textUser); 
     textTweet.setText(items.get(position).getName()); 

     textTweet = (TextView)tweetView.findViewById(R.id.textDate); 
     textTweet.setText(textFormat.format(items.get(position).getCreated())); 

     return tweetView; 
    } 


    @Override 
    public int getViewTypeCount() 
    { 
     // TODO Auto-generated method stub 
     return 1; 
    } 

    @Override 
    public boolean hasStableIds() 
    { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public boolean isEmpty() 
    { 
     // TODO Auto-generated method stub 
     return items.size() == 0; 
    } 

    @Override 
    public void registerDataSetObserver(DataSetObserver arg0) 
    { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void unregisterDataSetObserver(DataSetObserver arg0) 
    { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public boolean areAllItemsEnabled() 
    { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public boolean isEnabled(int arg0) 
    { 
     // TODO Auto-generated method stub 
     return false; 
    } 

} 

टोस्ट या लॉग काम नहीं कर रहा है कि कैसे मैं यह काम नहीं कर रहा है

अपडेट किया गया getView विधि

बता सकते है
public View getView(int position, View convertView, ViewGroup parent) 
    { 
      OnClickListener SaveView = new OnClickListener() { 
      @SuppressLint("NewApi") 
      public void onClick(View v) 
      { 
       Toast.makeText(v.getContext(), "Saved", Toast.LENGTH_LONG).show(); 
       v.callOnClick(); 
      } 
     }; 
      LayoutInflater inflater = (LayoutInflater)context.getSystemService(
      Context.LAYOUT_INFLATER_SERVICE 
      ); 
      View tweetView = inflater.inflate(R.layout.tweet, null); 

      TextView textTweet = (TextView) tweetView.findViewById(R.id.textTweet);  
      textTweet.setText(items.get(position).getTweet()); 

      textTweet = (TextView)tweetView.findViewById(R.id.textUser); 
      textTweet.setText(items.get(position).getName()); 

      textTweet = (TextView)tweetView.findViewById(R.id.textDate); 
      textTweet.setText(textFormat.format(items.get(position).getCreated())); 
      tweetView.setOnClickListener(SaveView); 
      return tweetView; 
    } 

अद्यतन

मुद्दा हल किया गया था और मैं इसे समझ से बाहर: डी मैं अपने अनुकूलक वर्ग के भीतर के बजाय सच इन दोनों तरीकों में झूठी लौटना पड़ा!

@Override 
    public boolean areAllItemsEnabled() 
    { 
     return true; 
    } 

    @Override 
    public boolean isEnabled(int arg0) 
    { 
     return true; 
    } 
+0

इस प्रश्न से संबंधित है, लेकिन अगर (convertView == नल) उसके बाद ही आप इसे हवा भरना चाहिए फिर से उपयोग convertView, करने के लिए अनुशंसित नहीं है। अन्यथा कनवर्ट व्यू –

+0

का पुनः उपयोग करें, आपको अपना 'MyArrayAdapter' कोड शामिल करना चाहिए क्योंकि यह आपकी समस्या का स्रोत भी हो सकता है। – andr

+0

मैंने MyArrayAdapter क्लास कोड – AndroidNoob

उत्तर

1

मैं आमतौर पर अनुकूलक अपने आप में क्लिक श्रोता डाल:

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

     OnClickListener yourClickListener = new OnClickListener() { 
       public void onClick(View v) { 
       //put your desired action here 
       v.callOnClick(); 
       } 
      }; 

    ... 

    // then add the listener to your view 
    tweetView.setOnClickListener(yourClickListener); 
+0

त्वरित उत्तर के लिए धन्यवाद शामिल किया! यह बहुत सराहना की है! केवल यही है कि मैं किसी भी पंक्तियों पर क्लिक नहीं कर सकता, कम से कम यह भी हाइलाइट नहीं करता है या – AndroidNoob

+0

क्या टोस्ट अब काम करता है लेकिन पंक्तियां दबाए जाने पर दृश्य प्रतिक्रिया का संकेत नहीं देती हैं? या टोस्ट अभी भी काम नहीं किया? अपने नवीनतम एडाप्टर कोड को देखना अच्छा होगा। – TrippinBilly

+0

यह अभी भी काम नहीं किया है जब मैंने यहां पोस्ट किए गए सभी अलग-अलग समाधानों का प्रयास किया है, तो कोड मैंने अभी लिखा है मेरे एडाप्टर – AndroidNoob

-1

अपने ListView एक्सएमएल के लिए नीचे पंक्ति जोड़ें

android:choiceMode="singleChoice" 
+0

दुर्भाग्य से – AndroidNoob

+0

काम नहीं करता है आपका एंड्रॉइड संस्करण <3 –

+0

नहीं है यह 4.1 जेली बीन – AndroidNoob

0

onItemClick विधि के अंदर जोड़ें:

v.setSelected(true); 
+0

यह कैसे काम करना चाहिए? प्रश्न फिर से पढ़ें - ओपी ने कहा कि न तो 'टोस्ट' और न ही 'लॉग' काम कर रहा है, इसलिए ऐसा लगता है कि' onItemClick() 'को नहीं कहा जाता है। – andr

57

आमतौर पर ऐसा होता है beca अपने सूचीदृश्य में आइटम का उपयोग फोकस में हैं। अपने कस्टम सूचीदृश्य पंक्ति में

android:descendantFocusability="blocksDescendants" 

जोड़ने

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="?android:attr/listPreferredItemHeight" 
    android:padding="6dip" 
    android:orientation="vertical" 
    android:descendantFocusability="blocksDescendants"> 
+2

यह सब अच्छा है, मुझे सिर्फ एडाप्टर में सेट को जोड़ने के लिए सही है और एडाप्टर में सक्षम है – AndroidNoob

+0

मैंने अतीत में इस समाधान का भी प्रयास किया है और यह एडाप्टर चाल के साथ काम नहीं करता है, लेकिन अब मुझे यह काम करने के लिए मिला है। धन्यवाद दोस्त, मैं मदद करने की कोशिश की सराहना करता हूँ! – AndroidNoob

+1

मेरे लिए यह 'वंशज' फोकसबिलिटी 'समाधान काम करता है, और' areAllItemsEnabled'/'isEnabled' नहीं किया गया था। क्यों नहीं मिल सकता है। –

-2

इस कोशिश का प्रयास करें?

 @Override 
    public boolean isEnabled(int position) { 
     //Set a Toast or Log over here to check. 
     return true; 
    } 
संबंधित मुद्दे