【问题标题】:Android calling a fragment with arguments clicking on a listview inside a custom adapterAndroid 调用带有参数的片段,单击自定义适配器内的列表视图
【发布时间】:2013-12-07 08:42:03
【问题描述】:

我有一个扩展 FragmentActivity 的 MainActivity,它使用导航抽屉调用一些片段,其中一个片段显示了一个由我所做的自定义适配器创建的列表视图,我的问题,我如何通过单击这个的单个文本视图来调用另一个片段传递与该元素相关的 id 或字符串的列表视图?我将接口视为片段之间的通信,但在我的情况下,我无法管理片段内的点击事件,因为我在适配器中进行。抱歉英语不好(英语很差)

片段一

package com.example.ghisa;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import android.R.layout;
import android.app.Activity;
import android.app.FragmentTransaction;
import android.content.Context;
import android.content.DialogInterface.OnClickListener;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.app.ListFragment;
import android.widget.AdapterView.OnItemClickListener;


public class FragmentOne extends Fragment {   
     public String testo;       
     public static Fragment newInstance(Context context) {
        FragmentOne f = new FragmentOne();


        return f;
    }



    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle     savedInstanceState) {

        ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_one, null);

        //nei fragment non possiamo fare getApplicationContext() ma getActivity che ritorna
        //l'attività associata al frammento l'attività è un context dal momento che activity extends context

       Database db=new Database(getActivity());        
         db.open();  //apriamo il db  

         List list = new LinkedList();

         Cursor c = db.prendiSchede();
         /* Check if our result was valid. */ 
   if (c != null) {//Toast.makeText(getActivity(), "asdasd", Toast.LENGTH_SHORT).show();
   c.moveToFirst();
   int firstNameColumn = c.getColumnIndex("nome"); 
   int id=c.getColumnIndex("id");
   if (c.isFirst()) { 
       int i = 0; 

       do { 
            i++; 
            String firstName = c.getString(firstNameColumn); 
            int id1=c.getInt(id);

            list.add(new Scheda(firstName,id1)); 
       } while (c.moveToNext()); 
  } 
   }


// Caricamento dati nella listview e nell'adapter tramite results
     (getActivity(),R.layout.simple_list_item_1,R.id.ListView2,results);
         final ListView listView= (ListView)root.findViewById(R.id.listView);     
         final AdapterSchede adapter1 = new AdapterSchede(getActivity(),  R.layout.simple_list_item_1, list);

       listView.setAdapter(adapter1);

  final TextView text=(TextView)root.findViewById(R.id.ListView3);


       Button button2 = (Button) root.findViewById(R.id.inviascheda);
       button2.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {

           Database db=new Database(getActivity());        
              db.open();  //apriamo il db   
              EditText text = (EditText)getView().findViewById(R.id.creascheda);
               String testo=text.getText().toString();
               if(testo!=null){
                  Toast.makeText(getActivity(), "Scheda creata!", Toast.LENGTH_SHORT).show();
                  db.inserisciScheda(testo);

                  android.support.v4.app.FragmentTransaction ft = getFragmentManager().beginTransaction();
                  ft.replace(R.id.main, new FragmentOne()); //yesss 
                  ft.commit();
              }

         }
       });



      return root;

    }

    }

我的自定义适配器

package com.example.ghisa;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class AdapterSchede extends ArrayAdapter<Scheda>{
public static List f;
public static int posizioneid;

    public AdapterSchede(Context context, int textViewResourceId,
             List list ) {
        super(context, textViewResourceId, list);
         f=list;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) getContext()
             .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.simple_list_item_1, null);
        TextView nome = (TextView)convertView.findViewById(R.id.ListView3);
        Button b1= (Button)convertView.findViewById(R.id.cancellascheda);

        final Scheda s = getItem(position);
        //qua mette nella TextView nome il nome preso dall'item s
        nome.setText(s.getNome() +" "+ s.getId());
        final int idd=s.getId();


        nome.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // HERE I SHOULD CALL ANOTHER FRAGMENT PASSING THE FIELD nome 

}


            }
            });


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

                //Toast.makeText(getContext()," "+ idd, Toast.LENGTH_SHORT).show();
                 Database db=new Database(getContext());        
                 db.open();
                 db.cancellaScheda(idd);
                 f.remove(position);
                 notifyDataSetChanged();
            }       
            });

        return convertView;
    }

  public  void setid(int pos){
        final Scheda k;
        k = getItem(pos);
        setposizionelemento(k.getId());
    }

  void setposizionelemento(int idd){
      this.posizioneid= idd;

  }
}

谢谢你!!!

【问题讨论】:

    标签: android listview android-fragments adapter android-adapter


    【解决方案1】:

    试试下面的代码:

    ((FragmentActivity) mContext).getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout, new YourFragment()).
                                addToBackStack(null).commit();
    

    【讨论】:

      【解决方案2】:

      像这样替换适配器中的片段:

      TARGET_FRAGMENT tf = new TARGET_FRAGMENT ();
      tf.setArguments(YOUR_ARGUMENT_BUNDLE);
      
      FragmentTransaction ft = YOUR_CONTEXT.getFragmentManager().beginTransaction();
       ft.replace(R.id.container_layout, tf);
       ft.addToBackStack(null);
       ft.commit();
      

      现在像这样在目标片段中获取参数:

      public class Frag2 extends Fragment {
      
               public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
                   //here is your arguments
                   Bundle bundle=getArguments(); 
      
                  //here is your list array 
                  String[] myStrings=bundle.getStringArray("tag");   
               }
          }
      

      更新:获取上下文

      private FragmentActivity mContext;
      
       public AdapterSchede(FragmentActivity context, int textViewResourceId, List list ) {
              super(context, textViewResourceId, list);
               this.mContext = context;
               f=list;
          }
      

      现在你可以在context的地方使用mContext

      【讨论】:

      • 感谢您的快速回答 :) 我应该在 YOUR_CONTEXT 中添加什么,我一周前开始学习 android,谢谢!
      • 如果你在activity中使用ClassName.this,或者在fragment中使用getActivity()。
      • 是的,我之前说过因为使用getActivity我得到的方法getActivity()是未定义的类型new View.OnClickListener(){}
      • 使用适配器构造函数中的上下文。检查我更新的答案。
      • 在私有 mContext 上;我在令牌“私人”上收到语法错误,导入预期:D
      【解决方案3】:

      我通过将片段管理器也作为变量传递给适配器来解决

         FragmentManager fragmanager = getFragmentManager();
      
             final AdapterSchede adapter1 = new AdapterSchede(getActivity(), R.layout.simple_list_item_1, list, fragmanager);
      

      然后在适配器中我可以使用片段事务方法!

      【讨论】:

        【解决方案4】:

        从适配器的上下文中获取 fragMentManager 将不起作用。从调用适配器的片段中获取它,并通过其构造函数将其传递给适配器。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-06-11
          • 1970-01-01
          • 1970-01-01
          • 2015-07-20
          • 1970-01-01
          • 1970-01-01
          • 2015-03-01
          相关资源
          最近更新 更多