2016-07-27 32 views
-1

當用戶按下#button時,它如何可能,然後它將在RecyclerView的聚焦EditText上打印#。 我的代碼和輸出如下。 請幫我....如何獲取RecyclerView.Adapter類中的活動按鈕點擊偵聽器

我已經做了一切,但卡在這裏。我可以得到任何建議或鏈接關於如何實現這一點的更多信息?

activity_main.xml中

<?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 

     <LinearLayout 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content"> 

      <Button 
       android:id="@+id/btnAt" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="\@" /> 

      <Button 
       android:id="@+id/btnHash" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="\#" /> 
     </LinearLayout> 

     <android.support.v7.widget.RecyclerView 
      android:id="@+id/recyclerView" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 

    </LinearLayout> 

MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener { 


      private RecyclerView mRecyclerView; // RecyclerVIew 
      private CheckItemAdapter myAdapterRecyclerView; //The Adapter for RecyclerVIew 

      Button btnAt, btnHash; 

      @Override 
      protected void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.activity_main); 

       mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView); 
       setAdapter(); 


       btnAt = (Button) findViewById(R.id.btnAt); 
       btnHash = (Button) findViewById(R.id.btnHash); 
      } 

      public void setAdapter() { 
       mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); // Set LayoutManager in the RecyclerView 
       myAdapterRecyclerView = new CheckItemAdapter(this, getData()); // Create Instance of MyAdapterRecyclerView 
       mRecyclerView.setAdapter(myAdapterRecyclerView); // Set Adapter for RecyclerView 
      } 

      public ArrayList<ItemModel> getData() { 

       ArrayList<ItemModel> itemModelArrayList = new ArrayList<ItemModel>(); 

       ItemModel itemModel = new ItemModel(); 
       itemModel.setChkText("ABC"); 
       itemModelArrayList.add(itemModel); 


       itemModel = new ItemModel(); 
       itemModel.setChkText("ABC"); 
       itemModelArrayList.add(itemModel); 

       itemModel = new ItemModel(); 
       itemModel.setChkText("ABC"); 
       itemModelArrayList.add(itemModel); 

       itemModel = new ItemModel(); 
       itemModel.setChkText("ABC"); 
       itemModelArrayList.add(itemModel); 

       itemModel = new ItemModel(); 
       itemModel.setChkText("ABC"); 
       itemModelArrayList.add(itemModel); 

       itemModel = new ItemModel(); 
       itemModel.setChkText("ABC"); 
       itemModelArrayList.add(itemModel); 

       itemModel = new ItemModel(); 
       itemModel.setChkText("ABC"); 
       itemModelArrayList.add(itemModel); 

       return itemModelArrayList; 
      } 

      @Override 
      public void onClick(View v) { 

       if (v.getId() == R.id.btnAt) { 
        //print @ on focused EditText of RecyclerView item 
       } else if (v.getId() == R.id.btnHash) { 
        //print # on focused EditText of RecyclerView item 
       } 
      } 
     } 

CheckItemAdapter

 public class CheckItemAdapter extends RecyclerView.Adapter<CheckItemAdapter.MyViewHolder> { 

      private ArrayList<ItemModel> mList; 
      Context context; 

      public CheckItemAdapter(Context context, ArrayList<ItemModel> mList) { 
       this.mList = mList; 
       this.context = context; 
      } 

      @Override 
      public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // create a new view 
       View itemLayoutView = LayoutInflater.from(context).inflate(R.layout.single_check_list, parent, false); 

       // create ViewHolder 
       MyViewHolder viewHolder = new MyViewHolder(itemLayoutView); 

       return viewHolder; 
      } 

      @Override 
      public void onBindViewHolder(MyViewHolder holder, int position) { 
       ItemModel itemModel = mList.get(position); 

       holder.editCheckItem.setText(itemModel.getChkText()); 
      } 

      @Override 
      public int getItemCount() { 
       if (mList != null) 
        return mList.size(); 
       else 
        return 0; 
      } 

      public class MyViewHolder extends RecyclerView.ViewHolder { 


       public EditText editCheckItem; 
       public CheckBox chkItem; 
       public TextView txtRemove; 


       public MyViewHolder(View itemLayoutView) { 
        super(itemLayoutView); 
        editCheckItem = (EditText) itemLayoutView.findViewById(R.id.editCheckItem); 
       } 
      } 
     } 


    [![output image][1]][1] 

回答

0

讓自己的點擊收聽。

private static OnItemClickListener listener; 

public interface OnItemClickListener { 
    void onItemClick(View itemView, int position); 
} 

public void setOnItemClickListener(OnItemClickListener listener) { 
    YourAdapterClass.listener = listener; 
} 

// and in constructor of ViewHolder use it. 
yourButtonView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (listener != null) { 
        listener.onItemClick(itemView, getLayoutPosition()); 
       } 
      } 
}); 

因此,代碼應該在您的RecyclerView適配器中。在您的活動/片段中,您只需使用適配器的方法setOnItemClickListener。對於你的問題,這是正常的做法。

+0

我必須在Activity中編寫哪些代碼,以及我必須在適配器中寫入哪些代碼請給我解釋 –

+0

@MhhirPatel您應該在Adapter/ViewHolder類中編寫的所有代碼。 在活動中你只需要adapter.setOnItemClickListener(new AdapterClass.OnItemClickListener(...){...}); –

2

在您的活動中聲明按鈕爲靜態。

例: 在ABCActivity:

public static Button btnTest; 
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_add_family_member); 
    btnTest = (Button)findviewbyid(R.id.btnTest); 
} 

在Adpter:

ABCActivity.btnTest.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

     } 
    }); 
+0

我試過這個......它會在每次最後的位置添加#editText –

0

您應該檢查重點onBindViewHolder這樣的:

 @Override 
     public void onBindViewHolder(MyViewHolder holder, int position) { 
      ItemModel itemModel = mList.get(position); 

      holder.editCheckItem.setText(itemModel.getChkText()); 

      if(holder.editCheckItem.hasFocus()) { 
       // Add your # character to your edit text 
       holder.editCheckItem.append("#"); 
      } 
     } 

然後,只需通知你的適配器:

 @Override 
     public void onClick(View v) { 

      if (v.getId() == R.id.btnAt) { 
       //print @ on focused EditText of RecyclerView item 
      } else if (v.getId() == R.id.btnHash) { 
       //print # on focused EditText of RecyclerView item 
       myAdapterRecyclerView.notifyDataChanged(); 
      } 
     } 
+0

它不起作用 –

+0

我猜你點擊#按鈕時,你在失去焦點之前點擊你的edittext。 你應該像這個帖子一樣處理這種情況:http://stackoverflow.com/questions/20406472/edittext-in-listview-loses-focus-when-pressed-on-android-4-x –

+0

EditText處於焦點 –

相關問題