2017-02-28 44 views
0

基本上,我有這樣的結構:變更活動的EditText上從適配器中 - > CustomView

活動 - > RecyclerView適配器 - >自定義視圖

下面是我的代碼(我已經離開有些部分是爲了使它更清晰)。

這裏是我的活動,MainActivity.java:

public class MainActivity extends AppCompatActivity { 

    private final String TAG = "MainActivity"; 

    private EditText textField; 

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

     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 

     if (toolbar != null) { 
      setSupportActionBar(toolbar); 
     } 

     textField = (EditText) findViewById(R.id.textField); 

     // Adapter code 
    } 
} 

這裏是我的適配器,MyAdapter.java:

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

    private static final String TAG = "MyAdapter"; 

    private Context context; 

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

    public class ViewHolder extends RecyclerView.ViewHolder { 
     public ViewHolder(View v) { 
      super(v); 
     } 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     LayoutInflater inflater = LayoutInflater.from(context); 

     CustomView customView = new CustomView(context); 

     ViewHolder viewHolder = new ViewHolder(customView); 

     return viewHolder; 
    } 

    @Override 
    public void onBindViewHolder(final ViewHolder holder, int position) { 
     // 
    } 

} 

這裏是我的自定義視圖,CustomView.java:

public class CustomView extends RelativeLayout { 

    private final String TAG = "CustomView"; 

    private RelativeLayout mLayout; 
    private ImageView mPicture; 

    public CustomView(Context context) { 
     super(context); 
     init(); 
    } 

    public CustomView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    private void init() { 
     inflate(getContext(), R.layout.item_layout, this); 

     this.mLayout = (RelativeLayout) findViewById(R.id.layout); 
     this.mPicture = (ImageView) findViewById(R.id.picture); 

     mPicture.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // change text of EditText in Activity here 
      } 
     }); 
    } 

} 

我希望能夠做的是,如果用戶在自定義視圖點擊mPicture什麼,應該CH將我的活動中的EditText的文本改爲「Hello,world!」。

我該怎麼做?

+0

你試過'的EditText EDITTEXT =(EditText上)context.findViewById(R.id.textField);」 ?在CustomView中,保存對創建新CustomView時要求的上下文的引用。 –

+0

後來,我想讓它,以便它在不同的上下文/活動不同的東西。因此,在一個活動,我可能要改變一個EditText的文本,而在另一個活動,我可能要更改按鈕的顏色在屏幕上點擊'mPicture'時。 – user7632571

+0

如何將'adapter'改爲'abstract class',並在adapter中創建一個新的'abstract method',當'mPicture'被點擊時調用'abstract method',然後在activity中創建你自己的實現。請檢查我的答案。 – jemsnaban

回答

0

從私有更改文本框來:

public static EditText textField; 

在CustomView你應該能夠現在的setText:

mPicture.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      MainActivity.textField.setText("Hello World"); 
     } 
    }); 
+0

不...不要使用靜態變量,請... –

+0

靜態視圖不好,會發生令人討厭的內存泄漏。 – Remario

0

添加的接口。

public class CustomView extends RelativeLayout { 

    public interface PictureClickListener { 
     public void onPictureClick(); 
    } 

    private PictureClickListener listener; 

    public setPictureClickListener(PictureClickListener listener) { 
     this.listener = listener 
    } 

    ... 


     mPicture.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (CustomView.this.listener != null) 
        CustomView.this.listener.onPictureClick(); 
      } 
     }); 

設置界面,並實現它

public class MainActivity extends AppCompatActivity 
     implements PictureClickListener { 

    @Override public void onPictureClick() { 
     // change text of EditText in Activity here 
    } 

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

     // Apapter code 
     adapter.setPictureClickListener(MainActivity.this); 

} 

注:這將是不CustomView容易得多......只是有ViewHolder膨脹R.layout.item_layout和移動接口那裏。

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    LayoutInflater inflater = LayoutInflater.from(context); 

    View v = inflater.inflate(....); // here 

    ViewHolder viewHolder = new ViewHolder(v); 
    return viewHolder; 
} 

@Override 
public void onBindViewHolder(final ViewHolder holder, int position) { 
    holder.mPicture.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (MyAdapter.this.listener != null) 
       MyAdapter.this.listener.onPictureClick(); 
     } 
    }); 
} 
+0

我按照你的建議,但聽衆似乎總是'空',我不知道爲什麼。 – user7632571

+0

噢,對不起,我忘了使用'setPictureClickListener' ...但我不確定在哪裏考慮你有那個CustomView類。 –

0

首先,你可能會膨脹的自定義視圖裏面onCreateViewHolder方法,而不是創造CustomView類。我對這個問題的解決方案是通過更改適配器abstract class,並創建內部適配器一個新abstract方法。所有你需要做的就是override您的活動內abstract方法。

//change adapter to abstract class 
public abstract class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { 

    private static final String TAG = "MyAdapter"; 
    List<String> list = new ArrayList<>(); //your data 

    private Context context; 

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

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     LayoutInflater inflater = LayoutInflater.from(context); 

     View customView = inflater.inflate(R.layout.item_layout, parent, false); //inflate the custom view 

     ViewHolder viewHolder = new ViewHolder(customView); 

     return viewHolder; 
    } 

    @Override 
    public void onBindViewHolder(final ViewHolder holder, int position) { 
     ViewHolder body = (ViewHolder) holder; 
     body.populateView(); //you can also pass some parameters here 
    } 

    @Override 
    public int getItemCount() { 
     return list.size(); //size of your array 
    } 

    public class ViewHolder extends RecyclerView.ViewHolder { 
     private RelativeLayout mLayout; 
     private ImageView mPicture; 

     public ViewHolder(View v) { 
      super(v); 
      this.mLayout = (RelativeLayout) v.findViewById(R.id.layout); 
      this.mPicture = (ImageView) v.findViewById(R.id.picture); 
     } 

     public void populateView(){ 
      //set click listener to the picture 
      this.mPicture.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        onPictureClick(); // call the abstract method 
       } 
      }); 
     } 
    } 

    //create new abstract method 
    public abstract void onPictureClick(); 
} 
您的活動(或片段)

MyAdapter adapter = new MyAdapter(getApplicationContext()) { 
    @Override 
    public void onPictureClick() { //override the abstract method 
     //change edittext value here 
     textField.setText("Hello World"); 
    } 
}; 
相關問題