在再次填充之前,我无法清除片段中的列表视图?

时间:2017-08-13 16:58:57

标签: android listview android-fragments android-lifecycle

注意:

首先写任何东西之前。这不是重复,因为如果是,那么为什么我会在这里发布。我没有找到任何类似于stackoverflow的问题。答案对我有帮助,连续两天。

问题:

我有一个活动,它接受两个数据字段,然后转到下一个活动,其中view pager活动,活动打开2个片段postsprofile。这里的问题是,当我回到第一个活动输入不同的数据并转到片段时,listview显示重复的数据。

我尝试了所有可能的解决方案但没有效果。

我试图清除适配器。 我试图传递空适配器。 我在片段的生命周期中尝试了更多的东西,但没有。

所以请我帮忙。提前谢谢。

package psychrating.psychrating;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
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.ListView;
import android.widget.SearchView;
import android.widget.Spinner;
import android.widget.Toast;

import java.util.ArrayList;

/**
 * Created by Ahmeed on 8/7/2017.
 */

public class PostsFragment extends Fragment {

    static ListView posts_list;
    Spinner list_order;
    SearchView search;
    String category, date, activity;
    boolean get_data;
    public static ArrayList<String> data = null;
    static Context c;
    transient ViewHolder holder;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        data = null;
        activity = getArguments().getString("activity");
        category = getArguments().getString("category");
        date = getArguments().getString("date");
        if (activity == "main") {
            // get_data = true;
        }else {
            // get_data = true;
        }
        View view = inflater.inflate(R.layout.post_tab, container, false);
        init(view);
        posts_list.clearChoices();
        if (searchResultses != null) {
            searchResultses.clear();
            searchResultses = null;
        }
        return view;

    }

    private void init(View view) {
        posts_list = (ListView) view.findViewById(R.id.posts_list);
        list_order = (Spinner) view.findViewById(R.id.list_order);
        search = (SearchView) view.findViewById(R.id.search);
        posts_list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                holder = (ViewHolder) view.getTag();
                Temp temp = new Temp();
                temp.name = holder.name.getText().toString();
                temp.highest = holder.highest.getText().toString();
                temp.dname = holder.dname.getText().toString();
                temp.date = holder.date.getText().toString();
                temp.category = holder.category;
                temp.sdesc = holder.sdesc;
                temp.ddesc = holder.ddesc;
                Intent i = new Intent(c, ProfileActivity.class);
                i.putExtra("holder", temp);
                startActivity(i);
            }
        });


    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        c = context;
    }

    @Override
    public void onResume() {
        super.onResume();
        searchResultses = new ArrayList<>();
        new Server(this.getActivity(), "posts").execute(category, date);
    }

    public static final String TAG ="ahmed";

    static void removeCommas() {
        StringBuilder word = new StringBuilder();
        for (int i = 0; i < data.size(); i++) {
            for (int j = 0; j < data.get(i).length(); j++) {
                char c = data.get(i).charAt(j);
                if (c != ',') {
                    word.append(c);
                }else {
                    words.add(word.toString());
                    word.delete(0, word.length());
                }
            }
        }
    }

    @Override
    public void onPause() {
        super.onPause();
        searchResultses = null;
        adapter = null;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();

    }

    static void addToClass() {
        SearchResults s;
        int offset = 0;
        for (int j = 0; j < words.size(); j += 8) {
            Log.d(TAG, String.valueOf(words.size()));
            s = new SearchResults();
            for (int i = 0; i < 8; i++) {
                offset = 1;
                s.add(words.get(i * offset));
            }
            offset += 1;
            s.init();
            searchResultses.add(s);
        }
    }

    static ArrayList<SearchResults> searchResultses = null;
    static ArrayList<String> words = new ArrayList<>();
    static  MyCustomBaseAdapter adapter = null;

    public static void fillList() {
        removeCommas();
        addToClass();
        ArrayList<SearchResults> empty = new ArrayList<>();
        adapter = new MyCustomBaseAdapter(c, empty);
        adapter = new MyCustomBaseAdapter(c, searchResultses);
        posts_list.setAdapter(adapter);
    }
}

注意:

fillList是一个在完成检索数据时被asynctask调用的函数。使用data变量并从数据中删除逗号并向searchResult

添加单词
package psychrating.psychrating;

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

import java.io.Serializable;
import java.util.ArrayList;

/**
 * Created by Ahmeed on 8/10/2017.
 */

public class MyCustomBaseAdapter extends BaseAdapter {

    private static ArrayList<SearchResults> searchArrayList = null;

    private LayoutInflater mInflater;

    public MyCustomBaseAdapter(Context context, ArrayList<SearchResults> results) {
        super();
        searchArrayList = results;
        mInflater = LayoutInflater.from(context);
    }

    public int getCount() {
        return searchArrayList.size();
    }

    public Object getItem(int position) {
        return searchArrayList.get(position);
    }

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

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.row, parent, false);
            holder = new ViewHolder(convertView);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.name.setText(searchArrayList.get(position).getName());
        holder.highest.setText(searchArrayList.get(position).getHighest());
        holder.dname.setText(searchArrayList.get(position).getDName());
        holder.date.setText(searchArrayList.get(position).getDate());
        holder.category = searchArrayList.get(position).getCategory();
        holder.sdesc = searchArrayList.get(position).getSdesc();
        holder.ddesc = searchArrayList.get(position).getDdesc();

        convertView.setTag(holder);

        return convertView;
    }
}

服务器类

package psychrating.psychrating;

import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Build;
import android.support.v7.app.AlertDialog;
import android.util.Log;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;

/**
 * Created by Ahmeed on 8/6/2017.
 */

public class Server extends AsyncTask<String, String, String> {

    private Context context;
    private ProgressDialog progressDialog;
    private AlertDialog.Builder builder;
    private String type;

    private static ArrayList<String> data = null;

    Server(Context context, String type) {
        this.context = context;
        this.type = type;
    }

    private void createPreDialog(String message) {
        progressDialog = new ProgressDialog(context);
        progressDialog.setMessage(message);
        progressDialog.setCancelable(false);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            progressDialog.create();
        }
        progressDialog.show();
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        createPreDialog("hold on");
    }

    @Override
    protected String doInBackground(String... params) {
        switch (type) {
            case "login":
                String personName = params[0];
                String personEmail = params[1];
                String id = params[2];
                //
                OutputStreamWriter outputStreamWriter = null;
                BufferedWriter writer = null;
                BufferedReader bufferedReader = null;
                HttpURLConnection connection = null;

                String line;
                String result = null;
                try {
                    URL url = new URL("http://192.168.1.64/blabla/sign_in.php");
                    connection = (HttpURLConnection) url.openConnection();
                    connection.setRequestMethod("POST");
                    connection.setDoOutput(true);
                    connection.setDoInput(true);
                    connection.setConnectTimeout(8000);
                    outputStreamWriter = new OutputStreamWriter(connection.getOutputStream(), "UTF-8");
                    writer = new BufferedWriter(outputStreamWriter);
                    String parameters = "name=" + personName + "&email=" + personEmail + "&id=" + id;
                    writer.write(parameters);
                    writer.flush();
                    if (connection.getResponseCode() == 200) {
                        bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                        while ((line = bufferedReader.readLine()) != null) {
                            result = line;
                        }
                    } else {
                        result = "Server Error";
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        if (outputStreamWriter != null) {
                            outputStreamWriter.close();
                        }
                        if (connection != null) {
                            connection.disconnect();
                        }
                        if (bufferedReader != null) {
                            bufferedReader.close();
                        }
                        if (writer != null) {
                            writer.close();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                return result;
            case "posts":
                String category = params[0];
                String date = params[1];
                //
                OutputStreamWriter outputStreamWriter1 = null;
                BufferedWriter writer1 = null;
                BufferedReader bufferedReader1 = null;
                HttpURLConnection connection1 = null;

                String line1 = "";
                String result1 = null;
                try {
                    URL url1 = new URL("http://192.168.1.64/blabla/posts.php");
                    connection1 = (HttpURLConnection) url1.openConnection();
                    connection1.setRequestMethod("POST");
                    connection1.setDoOutput(true);
                    connection1.setDoInput(true);
                    connection1.setConnectTimeout(8000);
                    outputStreamWriter1 = new OutputStreamWriter(connection1.getOutputStream(), "UTF-8");
                    writer1 = new BufferedWriter(outputStreamWriter1);
                    String parameters1 = "category="+category+"&date="+date;
                    writer1.write(parameters1);
                    writer1.flush();
                    data = new ArrayList<>();
                    if (connection1.getResponseCode() == 200) {
                        bufferedReader1 = new BufferedReader(new InputStreamReader(connection1.getInputStream()));
                        while ((line1 = bufferedReader1.readLine()) != null) {
                            data.add(line1);
                        }
                    } else {
                        result1 = "Server Error";
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        if (outputStreamWriter1 != null) {
                            outputStreamWriter1.close();
                        }
                        if (connection1 != null) {
                            connection1.disconnect();
                        }
                        if (bufferedReader1 != null) {
                            bufferedReader1.close();
                        }
                        if (writer1 != null) {
                            writer1.close();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                return result1;
        }
        return null;
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        progressDialog.dismiss();
        switch (type) {
            case "login":
                switch (s) {
                    case "Connect Error":
                        createDialog(s);
                        break;
                    case "Done":
                        Toast.makeText(context, s, Toast.LENGTH_LONG).show();
                        MainActivity.updateUI(true);
                        break;
                    case "Already Exist":
                        MainActivity.updateUI(true);
                        break;
                    case "Server Error":
                        createDialog(s);
                        break;
                }
                break;
            case "posts":
                 if (data != null) {
                     PostsFragment.data = data;
                     PostsFragment.fillList();
                     data = null;
                 }
        }
    }

    private void createDialog(String message) {
        builder = new AlertDialog.Builder(context);
        builder.setTitle("Error");
        builder.setMessage(message);
        builder.setCancelable(false);
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });
        builder.create();
        builder.show();
    }
}

2 个答案:

答案 0 :(得分:0)

  

试试这个。 searchResultses.clear();在addToClass()的开头

 static void addToClass() {
        SearchResults s;
        searchResultses.clear();
        int offset = 0;
        for (int j = 0; j < words.size(); j += 8) {
            Log.d(TAG, String.valueOf(words.size()));
            s = new SearchResults();
            for (int i = 0; i < 8; i++) {
                offset = 1;
                s.add(words.get(i * offset));
            }
            offset += 1;
            s.init();
            searchResultses.add(s);
        }
    }

答案 1 :(得分:0)

PostsFragment.java中的words会使元素重复,在removeCommas()方法中首先清除单词,然后从数据中将值添加到words