2017-09-19 1 views
1

私はRecyclerViewとListViewの2つの主要アイテムからなるアクティビティを持っています。 RecyclerViewはフィルタとして機能し、その中の項目を選択/選択解除するとListViewの内容に影響します。私はRecyclerViewにonClickListenerを実装しようとするまで、すべてうまく動作し、それはオプションではないことに気付きました。RecyclerViewをクリックしたときのアクティビティのリフレッシュ

私はViewHolder内でOnClickListenerを設定するルートをダウンしようとしましたが、メインアクティビティ内の関数を呼び出してlistViewを更新する必要があります。任意のこのような相互作用は、次のエラーをトリガ:

java.lang.NullPointerException 
    at android.support.v7.app.AppCompatDelegateImplBase.<init>(AppCompatDelegateImplBase.java:117) 
    at android.support.v7.app.AppCompatDelegateImplV9.<init>(AppCompatDelegateImplV9.java:149) 
    at android.support.v7.app.AppCompatDelegateImplV11.<init>(AppCompatDelegateImplV11.java:29) 
    at android.support.v7.app.AppCompatDelegateImplV14.<init>(AppCompatDelegateImplV14.java:54) 
    at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:202) 
    at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:183) 
    at android.support.v7.app.AppCompatActivity.getDelegate(AppCompatActivity.java:519) 
    at android.support.v7.app.AppCompatActivity.findViewById(AppCompatActivity.java:190) 
    at .newsScreen._$_findCachedViewById(newsScreen.kt) 
    at .newsScreen.filterNews(newsScreen.kt:71) 
    at Cells.NewsFeedList$NewsSource$1.onClick(News Lists.kt:84) 

は、私はそれのクラスの外からUIにアクセスしようとしていますので、それは理にかなっていると、私はそれに代わるものを見つけることができませんでした。

RecyclerViewアダプタ:

class NewsFeedList() : RecyclerView.Adapter<NewsFeedList.NewsSource>() { 
    private var source: List<NewsFeed> = ArrayList() 

    constructor(s: ArrayList<NewsFeed>) : this() { 
     source = s 
    } 

    class NewsSource : RecyclerView.ViewHolder { 

     private var mTextView: TextView? = null 

     constructor(v: View): super(v) { 
      mTextView = v.title 
     } 

     fun bindInfo(news: NewsFeed, view: View, int: Int) { 
      mTextView!!.text = news.title 
      view.tag = int 
      view.setOnClickListener { newsScreen().filterNews(view.tag.toString().toInt()) } 
      if (news.selected) view.background = ColorDrawable(Color.parseColor(news.color)) 
      else view.background = ColorDrawable(Color.parseColor(design.backgroundColor)) 
     } 
    } 

    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): NewsFeedList.NewsSource { 
     val view = LayoutInflater.from(parent!!.context).inflate(R.layout.newsfeed_list, parent, false) 
     return NewsSource(view) 
    } 

    override fun onBindViewHolder(holder: NewsFeedList.NewsSource, position: Int) { 
     holder.bindInfo(source[position], holder.itemView, position) 
    } 

    override fun getItemCount(): Int { 
     return source.count() 
    } 

} 

その後、私のnewsScreenクラス内で私は、私が(RecyclerView)をフィルタリングするすべての参照を削除した場合、新しいデータ

fun filterNews(i: Int) { 

    newsFeed[i].selected = !newsFeed[i].selected 
    filter.adapter = NewsFeedList(newsFeed) 

} 

でRecyclerViewアダプタにアクセスする必要がありますすべては問題ありませんが、onClickListenerの目的はアクティビティー・コンテンツをリフレッシュすることです。

これを達成する方法はありますか、またはRecyclerViewを別のUI要素に変更する必要はありますか?

編集: 私はRecyclerViewにOnClickListenerを追加しようとしましたが、トリガーされていないようです。 コード:あなたのアダプタクラスの

filter.adapter = NewsFeedList(newsFeed) 
filter.layoutManager = LinearLayoutManager([email protected], LinearLayoutManager.HORIZONTAL, false) 
filter.setOnClickListener { v: View? -> 
     filterNews(v!!.tag.toString().toInt()) 
} 
+0

はなぜOnClickListenerの代わりにOnItemClickListener使用しない:

P.S:この答えは、ユーザーからの主要な助けを借りて書かれていましたか? –

+0

更新された質問を確認してください。私はAndroidに精通していないので、私が紛失していることが明らかになっているかもしれません。 –

+0

申し訳ありませんが、OnItemClickListenerは実際にはRecycleViewでうまく動作しません。私はあなたにNullPointerExceptionの問題を解決する方法についての答えを書いてきました。 –

答えて

1

さてさて、ここであなたが試すことができ、別の解決策です。

アダプタのコンストラクタ内のインターフェイスの参照を渡します。 ArrayList mList; ClickListenerリスナー。

public MyAdapter(ArrayList<NewsFeed> mList, ClickListener listener) { 
    this.listener = listener; 
} 

@Override 
public MyAdapter.NavViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.someL, parent, false); 
    return new ViewHolder(v, listener); 

} 

public void getItemClicked(int position){ 
    mList.get(position); 
} 

最後に、あなたの内側ViewHolderクラス:

class ViewHolder extends RecyclerView.ViewHolder implements OnClickListener { 

    TextView textView; 
    ImageView imageView; 
    ClickListener listener; 

    ViewHolder(View itemView, ClickListener listener) { 
     super(itemView); 
     this.listener = listener; 
     textView = (TextView) itemView.findViewById(R.id.text_view); 
     imageView = (ImageView) itemView.findViewById(R.id.image_view); 
     textView.setOnClickListener(this) 
    } 

    @Override 
    void onClick(View v) { 
     listener.onItemClicked(getAdapterPosition()); 
    } 

そして最後に(ClickListenerインタフェースを実装)は、あなたの活動の内側にあなたがあなたのアクションがあるでしょう、その内部のボイドonItemClicked(int position);を上書きする必要があります。 https://stackoverflow.com/users/2667883/chaynik

1

あなたは、このコードでそのようOnClickListenerを実装します(おそらく、内部クラスなど)ViewHolderクラスを持つことになります:

あなたのアダプターを想定し
class ViewHolder extends RecyclerView.ViewHolder implements OnClickListener { 

    TextView textView; 
    ImageView imageView; 

    ViewHolder(View itemView) { 
     super(itemView); 
     textView = (TextView) itemView.findViewById(R.id.text_view); 
     imageView = (ImageView) itemView.findViewById(R.id.image_view); 
    } 

    @Override 
    void onClick(View v) { 

    } 
} 

あなたのActivityクラスのメソッド/変数にアクセスするためにonClick()を使用する場合は、参照を持つ必要がある場合は、Activityクラスの内部クラスではありません。

望ましい方法は、あなたがあなたのViewHolderアダプタの内部クラスで与えられ、あなたのアダプタのコンストラクタを介してコンテキストの参照を渡すことです:

class MyAdapter extends extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

    Context context; 

    MyAdapter(Context context) { 
     this.context = context; 
    } 

    class ViewHolder extends RecyclerView.ViewHolder implements OnClickListener { 

     TextView textView; 
     ImageView imageView; 

     ViewHolder(View itemView) { 
      super(itemView); 
      textView = (TextView) itemView.findViewById(R.id.text_view); 
      imageView = (ImageView) itemView.findViewById(R.id.image_view); 
     } 

     @Override 
     void onClick(View v) { 
      // Here we gain access to non-private methods/variables 
      // of the Activity, which Context reference we are holding. 
      ((MyActivity) context).someMethod(); 
     } 
    } 
} 

希望、このことができます。

アプリにこのインタフェースを追加します:

interface ClickListener { 
    void onItemClicked(int position); 
} 

があなたのMainActivity(または任意の活動あなたは上のボタンを持っている)の内側にそれを実装

+0

それは私が最初にエラーを得るためにしたものです –

+0

その場合、より多くのコードを送信しなければなりません –

+0

ありがとう、マシンに戻ってくる明日更新されます –

関連する問題