如何在android中只设置一次listview行可点击?

时间:2016-04-04 04:50:37

标签: android listview

说明:            我的片段中有一个列表视图。当我单击listview的一行时,它会转到另一个activity。在listview中,我从适配器获取数据。 在适配器视图中,我设置了setOnClick()。

问题是,当我多次单击其中一行时,它会打开多个活动。我想只限制一次点击listview项目上的特定行。

这是我的片段,我获取listview并设置适配器 -

public class HomeFragment extends Fragment{
    public HomeFragment() {
    }

    public static String key_updated = "updated", key_description = "description", key_title = "title", key_link = "link", key_url = "url", key_name = "name", key_description_text = "description_text";
    private static String url = "";

    List<String> lst_key = null;
    List<JSONObject> arr_completed = null;
    List<String> lst_key2 = null;

    List<JSONObject> lst_obj = null;
    List<String> list_status = null;
    ListView completed_listview;
    int PagerLength = 0,exeption_flag=0;

    View rootView;
    private ViewPager pagerRecentMatches;
    private ImageView imgOneSliderRecent;
    private ImageView imgTwoSliderRecent;
    private ImageView imgThreeSliderRecent;
    private ImageView imgFourSliderRecent;
    private ImageView imgFiveSliderRecent;
    private ImageView imgSixSliderRecent;
    private ImageView imgSevenSliderRecent;
    private ImageView imgEightSliderRecent;

    LinearLayout selector_dynamic;
    LinearLayout Recent_header_layout;
    FrameLayout adbar;
    String access_token = "";
    SharedPreferences sharedPreferences;
    int current_pos=0,status_flag=0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(false);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.fragment_home, container, false);
        findViews();

        selector_dynamic = (LinearLayout) rootView.findViewById(R.id.selectors_dynamic);
        adbar = (FrameLayout) rootView.findViewById(R.id.adbar);
        new AddLoader(getContext()).LoadAds(adbar);

        MainActivity activity = (MainActivity) getActivity();
        access_token = activity.getMyData();

        sharedPreferences = getContext().getSharedPreferences("HomePref", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();

        if (access_token == null || access_token=="") {
            url = "https://api.litzscore.com/rest/v2/recent_matches/?access_token=" + sharedPreferences.getString("access_token", null) + "&card_type=summary_card";

        } else {
            editor.putString("access_token", access_token);
            editor.commit();
            url = "https://api.litzscore.com/rest/v2/recent_matches/?access_token=" + access_token + "&card_type=summary_card";
        }
        completed_listview = (ListView) rootView.findViewById(R.id.completed_listview);


        Recent_header_layout = (LinearLayout) rootView.findViewById(R.id.Recent_header_layout);

        Recent_header_layout.setVisibility(View.GONE);

        if(!Utils.isNetworkConnected(getContext())){
            dialog_popup();
        }
        else{
            new TabJson().execute();
        }
        pagerRecentMatches.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                return false;
            }
        });

        return rootView;
    }

    @Override
    public void onPrepareOptionsMenu(Menu menu) {
        super.onPrepareOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        return super.onOptionsItemSelected(item);
    }

    private void dialog_popup() {
        final Dialog dialog = new Dialog(getContext());
        DisplayMetrics metrics = getResources()
                .getDisplayMetrics();
        int screenWidth = (int) (metrics.widthPixels * 0.90);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(R.layout.internet_alert_box);
        dialog.getWindow().setLayout(screenWidth, WindowManager.LayoutParams.WRAP_CONTENT);
        dialog.setCancelable(true);

        Button btnNo = (Button) dialog.findViewById(R.id.btn_no);
        Button btnYes = (Button) dialog.findViewById(R.id.btn_yes);

        btnNo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
                getActivity().finish();
            }
        });
        dialog.show();
        btnYes.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(!Utils.isNetworkConnected(getContext())){
                    dialog_popup();
                }
                else{
                    dialog.dismiss();
                    new TabJson().execute();
                }
            }
        });
        dialog.show();
    }
    public class TabJson extends AsyncTask<String, String, String> {

        String jsonStr = "";

        @Override
        protected void onPreExecute() {
            Utils.Pdialog(getContext());
        }

        @Override
        protected String doInBackground(String... params) {

            jsonStr = new CallAPI().GetResponseGetMethod(url);
            exeption_flag=0;
            status_flag = 0;
            if (jsonStr != null) {
                try {
                    if (jsonStr.equals("IO") || jsonStr.equals("MalFormed") || jsonStr.equals("NotResponse")) {
                        exeption_flag = 1;
                    } else {
                        JSONObject obj = new JSONObject(jsonStr);

                        if (obj.has("status") && !obj.isNull("status")) {
                            if (obj.getString("status").equals("false") || obj.getString("status").equals("403")) {
                                status_flag = 1;
                            } else {
                                JSONObject data = obj.getJSONObject("data");
                                JSONArray card = data.getJSONArray("cards");

                                PagerLength = 0;
                                lst_obj = new ArrayList<>();
                                list_status = new ArrayList<>();
                                lst_key = new ArrayList<>();
                                lst_key2 = new ArrayList<>();

                                arr_completed = new ArrayList<>();
                                for (int i = 0; i < card.length(); i++) {
                                    JSONObject card_obj = card.getJSONObject(i);
                                    if (card_obj.getString("status").equals("started")) {
                                        PagerLength++;
                                        lst_obj.add(card_obj);
                                        list_status.add(card_obj.getString("status"));
                                        lst_key.add(card_obj.getString("key"));
                                    }
                                    if (card_obj.getString("status").equals("notstarted")) {
                                        PagerLength++;
                                        lst_obj.add(card_obj);
                                        list_status.add(card_obj.getString("status"));
                                        lst_key.add(card_obj.getString("key"));
                                    }
                                    if (card_obj.getString("status").equals("completed")) {
                                        arr_completed.add(card_obj);
                                        lst_key2.add(card_obj.getString("key"));
                                    }
                                }
                            }
                        }
                    }
                }
                catch(JSONException e){
                    e.printStackTrace();
                }
            }
            return null;
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            Utils.Pdialog_dismiss();

            if (status_flag == 1 || exeption_flag==1) {
                dialog_popup();
            } else {
                Recent_header_layout.setVisibility(View.VISIBLE);

                LiveAdapter adapterTabRecent = new LiveAdapter(getContext(), lst_obj, PagerLength, list_status, lst_key);
                adapterTabRecent.notifyDataSetChanged();
                pagerRecentMatches.setAdapter(adapterTabRecent);
                pagerRecentMatches.setCurrentItem(current_pos);


                ScheduleAdapter CmAdapter = new ScheduleAdapter(getContext(), arr_completed, lst_key2);
                CmAdapter.notifyDataSetChanged();
                completed_listview.setAdapter(CmAdapter);
            }
        }
    }

    private void findViews() {

        pagerRecentMatches = (ViewPager) rootView
                .findViewById(R.id.pager_recent_matches);
        imgOneSliderRecent = (ImageView) rootView
                .findViewById(R.id.img_one_slider_recent);
        imgTwoSliderRecent = (ImageView) rootView
                .findViewById(R.id.img_two_slider_recent);
        imgThreeSliderRecent = (ImageView) rootView
                .findViewById(R.id.img_three_slider_recent);
        imgFourSliderRecent=(ImageView)rootView.findViewById(R.id.img_four_slider_recent);
        imgFiveSliderRecent=(ImageView)rootView.findViewById(R.id.img_five_slider_recent);
        imgSixSliderRecent=(ImageView)rootView.findViewById(R.id.img_six_slider_recent);
        imgSevenSliderRecent = (ImageView) rootView.findViewById(R.id.img_seven_slider_recent);
        imgEightSliderRecent = (ImageView) rootView.findViewById(R.id.img_eight_slider_recent);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
    }

    @Override
    public void onDetach() {
        super.onDetach();
    }

}

从服务器加载数据后,它传递给onPost()我调用了一个扩展BaseAdpter的适配器

这是我的BaseAdapter

包适配器;

public class ScheduleAdapter extends BaseAdapter{

    private Context context;
    private List<JSONObject> arr_schedule;
    private List<String> arr_matchKey;
    private static LayoutInflater inflater;
    int flag = 0;
    String time="";
    String status="";
    String match_title = "";
    String match_key="";

    public ScheduleAdapter(Context context,List<JSONObject> arr_schedule,List<String> arr_matchKey){
        this.context=context;
        this.arr_schedule=arr_schedule;
        this.arr_matchKey=arr_matchKey;
        inflater=(LayoutInflater)this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

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

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

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

    private class Holder{
        TextView txt_one_country_name;
        TextView txt_two_country_name;
        TextView txt_venue;
        TextView txtTimeGMT;
        TextView txtDate;
        TextView txtTimeIST;
        ImageView team_one_flag_icon;
        ImageView team_two_flag_icon;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {

        Holder holder=new Holder();
        String[] parts;
        String[] state_parts;
        String[] match_parts;
        Typeface tf=null;
        String winner_team = "";
        String final_Score="";
        String now_bat_team="",team_name="";
        String related_status="";

        if(convertView==null) {

            convertView = inflater.inflate(R.layout.recent_home_layout, null);

            holder.txt_one_country_name = (TextView) convertView.findViewById(R.id.txt_one_country_name);
            holder.txt_two_country_name = (TextView) convertView.findViewById(R.id.txt_two_country_name);
            holder.txt_venue = (TextView) convertView.findViewById(R.id.venue);
            holder.txtTimeIST = (TextView) convertView.findViewById(R.id.txt_timeist);
            holder.txtTimeGMT = (TextView) convertView.findViewById(R.id.txt_timegmt);
            holder.txtDate = (TextView) convertView.findViewById(R.id.txt_date);
            holder.team_one_flag_icon = (ImageView) convertView.findViewById(R.id.team_one_flag_icon);
            holder.team_two_flag_icon = (ImageView) convertView.findViewById(R.id.team_two_flag_icon);

            tf = Typeface.createFromAsset(convertView.getResources().getAssets(), "Roboto-Regular.ttf");

            holder.txt_one_country_name.setTypeface(tf);
            holder.txt_two_country_name.setTypeface(tf);
            holder.txt_venue.setTypeface(tf);
            holder.txtTimeIST.setTypeface(tf);
            holder.txtTimeGMT.setTypeface(tf);
            holder.txtDate.setTypeface(tf);

            convertView.setTag(holder);
        }
        else{
            holder=(Holder)convertView.getTag();
        }

        try {
            String overs="";
            String wickets_now="";
            String now_runs="";
            String[] over_parts;

            time = "";
            JSONObject mainObj = this.arr_schedule.get(position);

            status = mainObj.getString("status");

            String name = mainObj.getString("short_name");
            String state = mainObj.getString("venue");
            String title = mainObj.getString("title");
            related_status=mainObj.getString("related_name");

            JSONObject start_date = mainObj.getJSONObject("start_date");


            JSONObject teams=null;
            JSONObject team_a=null;
            JSONObject team_b=null;
            String team_a_key="";
            String team_b_key="";
            time = start_date.getString("iso");

            parts = name.split("vs");
            match_parts = title.split("-");
            state_parts = state.split(",");

            int length = state_parts.length;

            flag=0;
            match_title="";
            winner_team="";

            if (!mainObj.isNull("msgs")) {
                JSONObject msgs = mainObj.getJSONObject("msgs");
                winner_team = "";
                if (msgs.has("info")) {
                    winner_team = msgs.getString("info");
                    flag = 1;
                }
            }

            match_title=name+" - "+match_parts[1];

            JSONObject now=null;
            if(mainObj.has("now") && !mainObj.isNull("now")) {
                now = mainObj.getJSONObject("now");
                if (now.has("batting_team")) {
                    now_bat_team = now.getString("batting_team");
                }
                if (now.has("runs")) {
                    if (now.getString("runs").equals("0")) {
                        now_runs = "0";
                    } else {
                        now_runs = now.getString("runs");
                    }
                }

                if (now.has("runs_str") && !now.isNull("runs_str")) {
                    if (now.getString("runs_str").equals("0")) {
                        overs = "0";
                    } else {
                        if(now.getString("runs_str").equals("null")){
                            overs="0";
                        }
                        else{
                            over_parts=now.getString("runs_str").split(" ");
                            overs=over_parts[2];
                        }
                    }
                }
                if (now.has("wicket")) {
                    if (now.getString("wicket").equals("0")) {
                        wickets_now = "0";
                    } else {
                        wickets_now = now.getString("wicket");
                    }
                }
            }
            try {
                if (!mainObj.isNull("teams") && mainObj.has("teams")) {
                    teams = mainObj.getJSONObject("teams");
                    team_a = teams.getJSONObject("a");
                    team_b = teams.getJSONObject("b");
                    team_a_key = team_a.getString("key");
                    team_b_key = team_b.getString("key");

                    JSONArray team_arr = teams.names();
                    JSONObject team_obj;
                    for (int a = 0; a < team_arr.length(); a++) {
                        if (now_bat_team.equals(team_arr.getString(a))) {
                            team_obj = teams.getJSONObject(team_arr.getString(a));
                            if (team_obj.has("short_name") && !team_obj.isNull("short_name")) {
                                team_name = team_obj.getString("short_name");
                            }
                        }
                    }
                }
            }
            catch (NullPointerException e){
                e.printStackTrace();
            }

            if(mainObj.has("status_overview") && !mainObj.isNull("status_overview")){
                if(mainObj.getString("status_overview").equals("abandoned") || mainObj.getString("status_overview").equals("canceled")){
                    final_Score="";
                }
                else{
                    final_Score=team_name+" - "+now_runs+"/"+wickets_now+" ("+overs+" ovr)";
                }
            }

            holder.txt_one_country_name.setText(parts[0]);
            holder.txt_two_country_name.setText(parts[1]);

            if(length==1){
                holder.txtTimeGMT.setTextSize(TypedValue.COMPLEX_UNIT_SP, 13);
                holder.txtTimeGMT.setText(state_parts[0]);
            }
            if(length==2){
                holder.txtTimeGMT.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12);
                holder.txtTimeGMT.setText(state_parts[0] + "," + state_parts[1]);

            }
            if(length==3){
                holder.txtTimeGMT.setTextSize(TypedValue.COMPLEX_UNIT_SP,12);
                holder.txtTimeGMT.setText(state_parts[1] + "," + state_parts[2]);
            }
            if(length==4){
                holder.txtTimeGMT.setTextSize(TypedValue.COMPLEX_UNIT_SP,12);
                holder.txtTimeGMT.setText(state_parts[2] + "," + state_parts[3]);
            }

            holder.txtDate.setText(final_Score);
            holder.txtDate.setTypeface(tf, Typeface.BOLD);
            holder.txtDate.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);
            holder.txtTimeIST.setText(winner_team);
            holder.txt_venue.setText(related_status);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        convertView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                match_key = arr_matchKey.get(position);
                MainActivity activity = (MainActivity) context;
                GetValue gv = new GetValue(context);
                gv.setFullUrl(match_key);
                gv.setAccessToken(activity.getMyData());
                gv.execute();
            }
        });

        return convertView;
    }

    @Override
    public boolean isEnabled(int position) {
        return super.isEnabled(position);
    }
}

此适配器将listrow项设置为listview。

在ScheduleAdapter.java中,我在convertView上设置了onclick(),在其中我调用了一个GetValue类,它只实现了一个Asynctask来获取数据并调用它,然后调用它来进行活动。

表示HomeFragment-&gt; ScheduleAdapter-&gt; GetValue-&gt;记分卡

下面,     HomeFragment是具有listview

的片段

ScheduleAdpter是一个适配器,它将数据设置为listview,它位于homefragment

GetValue是实现一些重要任务的类,它传递了一个intent并转到一个活动(它作为背景工作)

ScoreCard是我的活动,点击了位于HomeFragment中的listview行后调用。

请帮我解决这个问题。

4 个答案:

答案 0 :(得分:1)

您可以在Listview中使用标记click - isListClicked,并在Aysnc任务类的onPostexecute方法中将标志值设置为false -GetValue

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

        if(!isListClicked){
            match_key = arr_matchKey.get(position);
            MainActivity activity = (MainActivity) context;
            GetValue gv = new GetValue(context);
            gv.setFullUrl(match_key);
            gv.setAccessToken(activity.getMyData());
            gv.execute();
            isListClicked = true;
        }


    }
});

答案 1 :(得分:0)

如果您想阻止用户使用触摸进行多个活动,请在onClick事件中添加删除该onClickListener,以便在第一次按下后听众不会存在。

答案 2 :(得分:0)

简单的方法是,您可以使用持有者类中的那些字段创建json对象的模型类。并添加一个布尔字段isClickable,默认情况下为true值。现在,当用户第一次按行时,您可以将模型类字段isClickable设置为false。现在第二次当用户按下一行时,您将获得一个行位置,您可以检查isClickable。这次它会返回false。

模特课程:

public class CountryInfoModel {

  //other fields to parse json object
   private  boolean isClickable; //<- add one more extra field

    public boolean isClickable() {
        return isClickable;
    }

    public void setIsClickable(boolean isClickable) {
        this.isClickable = isClickable;
    }
}

listview点击执行:

 listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                //country_list is your list of model class List<CountryInfo>

                if(country_list.get(position).isClickable())
                {
                    //Perform your logic
                    country_list.get(position).setIsClickable(false);

                }else{
                    //Do nothing : 2nd time click
                }
            }
        });

答案 3 :(得分:0)

尝试为列表视图创建自定义单击侦听器并使用它。就这样

         public abstract class OnListItemClickListener implements  OnItemClickListener {


         private static final long MIN_CLICK_INTERVAL=600;
         private long mLastClickTime;
         public abstract void onListItemSingleClick(View parent, View view, int position, long id);

         public OnListItemClickListener() {
                 // TODO Auto-generated constructor stub
         }


           @Override
           public void onItemClick(AdapterView<?> parent, View view,  int position, long id) {
                      // TODO Auto-generated method stub
                      long currentClickTime=SystemClock.uptimeMillis();
                      long elapsedTime=currentClickTime-mLastClickTime;

                      mLastClickTime=currentClickTime;

                     if(elapsedTime<=MIN_CLICK_INTERVAL)
                     return;

                     onListItemSingleClick(parent, view, position, id);        

            }

     }