2016-08-15 1 views
-1

私はリストビューを持っており、私は行のためにカスタムビューを使用しています、そして、各行にボタンがあります。このボタンがクリックされたときに、あるデータが別のアクティビティに送られたかったのです。私は例外を与えるので、私はsetTagとgetTagの別のメソッドを試して、それはクラスキャストの例外をスクロールする原因になるので、以下のコードを検討してください。以下のコードでは、フレームレイアウトをListViewにキャストできないので、どうすればこの問題を修正できるのですか?リストビュー内でボタンをクリックしたときに、別のアクティビティや行の位置にデータを送信するにはどうすればいいですか?

public class EngNewsAdapter extends ArrayAdapter { 
    private List<EnglishNews> mENList; 
    private int mResource; 
    private LayoutInflater inflater; 

    public EngNewsAdapter(Context context, int resource, List<EnglishNews> objects) { 
      super(context, resource, objects); 

      mResource = resource; 
      mENList = objects; 
      inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); 
     } 

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

      ViewHolder holder = null; 

      if(convertView == null){ 

       holder = new ViewHolder(); 
       convertView = inflater.inflate(mResource, null); 

       holder.mENDate = (TextView)convertView.findViewById(R.id.pub_date); 
       holder.mENTitle = (TextView)convertView.findViewById(R.id.eng_news_title); 
       holder.mENSummary = (TextView)convertView.findViewById(R.id.eng_news_summary); 
       holder.mENImage = (ImageView)convertView.findViewById(R.id.eng_news_image); 
       holder.mENDescBtn = (LinearLayout)convertView.findViewById(R.id.read_more_eng_btn); 
       holder.shareButton = (ImageView)convertView.findViewById(R.id.eng_fb_share_button); 

       holder.mENTitle.setTypeface(headingStyle); 
       holder.mENSummary.setTypeface(contentStyle); 

       convertView.setTag(holder); 
      }else { 
       holder = (ViewHolder) convertView.getTag(); 
      } 

      //associating the data position to the button through intent to give the desc activity 
      holder.mENDescBtn.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 

        View parentRow = (View) view.getParent(); 
        ListView listView = (ListView) parentRow.getParent(); 
        int pos = (Integer) listView.getPositionForView(parentRow); 

        Intent intent = new Intent(EnglishNewsActivity.this, EnglishNewsDescriptionActivity.class); 
        intent.putExtra("image_url", mENList.get(pos).getNewsImage()); 
        intent.putExtra("title", mENList.get(pos).getNewsTitle()); 
        intent.putExtra("date", mENList.get(pos).getNewsDate()); 
        startActivity(intent); 
       } 
      }); 
      holder.mENTitle.setText(mENList.get(position).getNewsTitle()); 
      }); 

      return convertView; 
     } 
    } 

私の行レイアウト:

<?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:clickable="true" 
    android:layout_marginLeft="6dp" 
    android:id="@+id/read_more_eng_btn" 
    android:orientation="vertical"> 

    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 
     <ImageView 
      android:id="@+id/eng_news_image" 
      android:layout_width="match_parent" 
      android:layout_height="210dp" 
      /> 

     <ImageView 
      android:id="@+id/eng_fb_share_button" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 

     <TextView 
      android:id="@+id/eng_news_title" 
      android:layout_width="match_parent" 
      android:padding="3dp" 
      android:layout_height="wrap_content" 
      /> 
    </FrameLayout> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="110dp" 
     android:orientation="vertical"> 

     <TextView 
      android:id="@+id/pub_date" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 

     <TextView 
      android:id="@+id/eng_news_summary" 
      android:layout_width="match_parent" 
      android:layout_height="69dp"/> 

    </LinearLayout> 

</LinearLayout> 
+0

あなたの完全なアダプターコード – comeback4you

+0

を共有し、私が編集しました私のアダプタコードで質問 –

+0

あなたの行レイアウトしてください – MRX

答えて

0
ListView listView = (ListView) parentRow.getParent(); 

私は、キャスト例外がoccuresこれはどこだと思います。 私はあなたのNewsActivityでこれを設定AdapterView.OnItemClickListener

 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
       Intent intent = new Intent(NewsActivity.this, DescriptionActivity.class); 
       intent.putExtra("news_summary", mENList.get(i).getNewsSummary()); 
       intent.putExtra("news_url", mENList.get(i).getNewsUrl()); 
       startActivity(intent); 
      } 
     }); 

の使用することをお勧めします。

UPDATE

私はそれが代わりにカスタムArrayAdapterを作成するBaseAdapterを実装するための良い方法だと思います。

public class EngNewsAdapter extends BaseAdapter { 

    private List<EnglishNews> mENList; 
    private int mResource; 
    private LayoutInflater inflater; 

    private Context context; 

    public EngNewsAdapter(Context context, int resource, List<EnglishNews> objects) { 
     this.context = context; 
     mResource = resource; 
     mENList = objects; 
     inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); 
    } 

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

     ViewHolder holder = null; 

     if (convertView == null) { 

      holder = new ViewHolder(); 
      convertView = inflater.inflate(mResource, null); 

      holder.mENDate = (TextView) convertView.findViewById(R.id.pub_date); 
      holder.mENTitle = (TextView) convertView.findViewById(R.id.eng_news_title); 
      holder.mENSummary = (TextView) convertView.findViewById(R.id.eng_news_summary); 
      holder.mENImage = (ImageView) convertView.findViewById(R.id.eng_news_image); 
      holder.mENDescBtn = (LinearLayout) convertView.findViewById(R.id.read_more_eng_btn); 
      holder.shareButton = (ImageView) convertView.findViewById(R.id.eng_fb_share_button); 

      holder.mENTitle.setTypeface(headingStyle); 
      holder.mENSummary.setTypeface(contentStyle); 

      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     //associating the data position to the button through intent to give the desc activity 
     holder.mENDescBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Intent intent = new Intent(context, EnglishNewsDescriptionActivity.class); 
       intent.putExtra("image_url", mENList.get(position).getNewsImage()); 
       intent.putExtra("title", mENList.get(position).getNewsTitle()); 
       intent.putExtra("date", mENList.get(position).getNewsDate()); 
       startActivity(intent); 
      } 
     }); 

     return convertView; 
    } 

    @Override 
    public int getCount() { 
     return mENList != null && !mENList.isEmpty() ? mENList.size() : 0; 
    } 

    @Override 
    public Object getItem(int i) { 
     return mENList.get(i); 
    } 

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

} 
+0

"listviewの中でボタンをクリックした"彼はボタンをクリックして、リストビューをクリックしているのを尋ねている。間違った答え。 – comeback4you

+0

はい私を間違えてしまいます。あなたが答える前に質問を慎重にお読みください –

+0

私はあなたに同意します! – MrOnyszko

0

//コンテキスト

private Context context; 

public EngNewsAdapter(Context context, int resource, List<EnglishNews> objects) { 
     super(context, resource, objects); 
     //context use 
     this.context=context; 

    } 

//を追加するには以下のようにしようとするかもしれ

holder.mENDescBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Intent intent = new Intent(context, EnglishNewsDescriptionActivity.class); 
       intent.putExtra("image_url", mENList.get(position).getNewsImage()); 
       intent.putExtra("title", mENList.get(position).getNewsTitle()); 
       intent.putExtra("date", mENList.get(position).getNewsDate()); 
       context.startActivity(intent); 
      } 
     }); 
+0

'position'をfinalに設定する必要があります。それ以外の場合は 'intent.putExtra(" image_url "、mENList.get(position).getNewsImage());'行はコンパイルエラーを返します。 –

0

をクリックします。

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

     .... 

     //associating the data position to the button through intent to give the desc activity 
     holder.mENDescBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       Intent intent = new Intent(context, EnglishNewsDescriptionActivity.class); 
       intent.putExtra("image_url", mENList.get(position).getNewsImage()); 
       intent.putExtra("title", mENList.get(position).getNewsTitle()); 
       intent.putExtra("date", mENList.get(position).getNewsDate()); 
       startActivity(intent); 
      } 
     }); 

     ...... 
     return convertView; 
    } 
+0

インテントコールのコンテキストが必要です インテントインテント=新しいインテント(EnglishNewsActivity.this、EnglishNewsDescriptionActivity.class); //アダプタで動作していない行 – comeback4you

+0

ありがとうございます。コードを編集しました。 –

関連する問題