2016-08-02 53 views
0

我有动态填充的ImageViews和Textviews。如何在ImageView上实现onClick()方法

现在我有一个在ImageView上实现onClick方法的小问题。在某些ImageView上单击它应该切换到片段,并有一些点击到活动。 这里是我的代码 - 我的主要片段:

public class MainFragment extends Fragment { 
public static String[] gridViewStrings = { 
      "string1", 
      "string2", 
      "string3", 
      "string4", 
      "string5", 
      "string6" 
    }; 
    public static int[] gridViewImages = { 
      R.drawable.delivery, 
      R.drawable.shipping_logs, 
      R.drawable.meassurement, 
      R.drawable.takeovers, 
      R.drawable.settings, 
      R.drawable.download_data 
    }; 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.main_fragment, parent, false); 
gridView = (GridView) view.findViewById(R.id.grid); 
     gridView.setAdapter(new CustomAndroidGridViewAdapter(getActivity(), gridViewStrings, gridViewImages)); 

     imageView = (ImageView) view.findViewById(R.id.gridview_image); 
} 

我自定义的GridView适配器:

public class CustomAndroidGridViewAdapter extends BaseAdapter { 
    private Context mContext; 
    private final String[] string; 
    private final int[] Imageid; 

    public CustomAndroidGridViewAdapter(Context c,String[] string,int[] Imageid) { 
     mContext = c; 
     this.Imageid = Imageid; 
     this.string = string; 
    } 

    @Override 
    public int getCount() { 
     return string.length; 
    } 

    @Override 
    public Object getItem(int p) { 
     return null; 
    } 

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

    @Override 
    public View getView(final int p, final View convertView, ViewGroup parent) { 
     View grid; 
     LayoutInflater inflater = (LayoutInflater) mContext 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     if (convertView == null) { 

      grid = new View(mContext); 
      grid = inflater.inflate(R.layout.grid, null); 
      TextView textView = (TextView) grid.findViewById(R.id.gridview_text); 
      ImageView imageView = (ImageView)grid.findViewById(R.id.gridview_image); 
      textView.setText(string[p]); 
      imageView.setImageResource(Imageid[p]); 
     } else { 
      grid = (View) convertView; 
     } 

     return grid; 
    } 
} 

问题:如何在ImageView的实现的onClick()并切换到片段和活动?

回答

1

接口回调:

public interface LaunchFragmentWithImage{ 
void launchFragmentWithImage(int imageID); 
} 

给适配器低于这个类的一个基准,因此它可以调用该方法。不建议给适配器本身一个参考,因为它不适合适配器负责知道谁接收图像,因此违反了OOD的单一责任原则,但为了学习它的好处。

public class ClassToLaunchNewFragment extends AppCompatActivity implements 
LaunchFragmentWithImage{ 

    @Override //Method from interface we've defined. 
    public void launchFragmentWithImage(int imageID){ 
    FragmentToLaunch fragmentToLaunch = FragmentToLaunch.newInstance(); 
    Bundle imageData = new Bundle(); 
    imageData.putInt(imageID, "key"); 
    fragmentToLaunch.setArguments(imageData); 

    getSupportFragmentManager().beginTransaction() //Call replace not add 
           .replace(containerID, fragmentToLaunch) 
           .commit(); 

    } 

} 

在AdapterClass

imageViewVar.setOnClickListener(new View.OnClickListener(){ 

@Override 
public void onClick(View view){ 
fragmentToLaunchInstanceThatWasPassedIn.launchFragmentWithImage(theImageResource); 
} 


}); 
+0

我知道接口看起来像没有用,因为它们除了定义方法之外什么都不做签名,但实际上他们是OOP程序员的梦想。我建议你真的学会如何使用它们。 –

+0

谢谢你的回答,非常有用。这是我要去特定片段的例子。当不同的图像打开不同的片段时,你能否给我提供几点建议 – RubyDigger19

+0

这实际上取决于你想如何构造碎片。我的意思是,如果这些片段是相同的一般对象,但具有不同的行为和状态,我建议让他们扩展一个抽象类,然后根据哪个imageview是基于哪个图像视图挑选并选择要启动的抽象片段的哪个结构点击。此外,如果我的答案有帮助,一定要评为最佳答案并进行投票。谢谢! –

0
grid = new View(mContext); 
grid = inflater.inflate(R.layout.grid, null); 

你为什么要将网格变量指向两个单独的视图对象?

+0

错误,我做了一些事情,忘记删除第一行。 – RubyDigger19

+0

哦,好吧。那么你必须像你的答案一样具体,因为你必须在编码方面。你在问如何启动一个新的片段实例,或者问如何启动一个新的活动? –

+0

这两者,因为其中一些ImageView会去片段和一些活动,但让我们专注于片段。 – RubyDigger19

0
if (convertView == null) { 

     grid = inflater.inflate(R.layout.grid, null); 
     TextView textView = (TextView) grid.findViewById(R.id.gridview_text); 
     ImageView imageView = (ImageView)grid.findViewById(R.id.gridview_image); 
     textView.setText(string[p]); 
     imageView.setImageResource(Imageid[p]); 
     imageView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      switch(choosedPosition){ 
       case 0:do something;break; 
       case 1:do something;break; 
       ... 
      } 
     } 
     }); 
     } 

这只是一个例子,不能运行。

3
public DlgOutletListAdapter(Context context, List<WrapperOutlet> wrapperOutletList, View.OnClickListener listener) { 
     this.context = context; 
     this.wrapperOutletList = wrapperOutletList; 
     this.listener = listener;  //---> pass in listener.... 

    } 

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

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

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

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder viewHolder; 
     if (convertView == null) { 
      convertView = LayoutInflater.from(context).inflate(R.layout.item_dlg_outlet_list, parent, false); 
      viewHolder = new ViewHolder(convertView); 
      viewHolder.ll_dlg_outlet_list_container.setOnClickListener(listener); 
      convertView.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 

     if (!wrapperOutletList.isEmpty()) { 
      WrapperOutlet wrapperOutlet = wrapperOutletList.get(position); 
      Outlet outlet = wrapperOutlet.getOutlet(); 
      if (outlet != null) { 
       if (TextUtils.isEmpty(outlet.getTel())){ 
        viewHolder.ivCall.setImageResource(R.drawable.icon_call2); 
        viewHolder.tvCall.setTextColor(context.getResources().getColorStateList(R.color.medium_gray)); 
         viewHolder.ll_dlg_outlet_list_dialer.setOnClickListener(null); 
       } else { 
        viewHolder.ivCall.setImageResource(R.drawable.icon_call); 
        viewHolder.tvCall.setTextColor(context.getResources().getColorStateList(R.color.fresh_teal)); 
        viewHolder.ll_dlg_outlet_list_dialer.setOnClickListener(listener);  
       } 


      } 
     } 

     return convertView; 
    } 

通行证的听众。给你一个上面的例子。以下代码是您在片段中调用适配器的位置。我的片段实现View.OnClickListener

lv_dlg_outlet_list.setAdapter(new DlgOutletListAdapter(activity, wrapperOutletList, this));