PagerSlidingTabStrip- 使用列表片段的自定义视图显示突然的行为

Posted

技术标签:

【中文标题】PagerSlidingTabStrip- 使用列表片段的自定义视图显示突然的行为【英文标题】:PagerSlidingTabStrip- custom view using list fragment shows abrupt behaviour 【发布时间】:2015-06-20 16:36:58 【问题描述】:

我正在使用PagerSlidingTabStrip 创建一个滑动标签。我成功地在我的项目中使用了这个库。

基于选择/单击的选项卡,应用程序应向服务器发送获取请求以获取数据并填充列表视图。每次选择选项卡时,都会对服务器进行 http 调用并更新列表视图。

我只是在示例中修改SuperAwesomeCardFragment.java:

public class SuperAwesomeCardFragment extends ListFragment 

private ListView listView;
private ArrayList<User> arrayOfUsers = new ArrayList<User>();
private UsersAdapter useradapter;
ProgressDialog mProgressDialog;
ArrayList<HashMap<String, String>> arraylist;
JSONObject jsonobject;
JSONArray ja;

private static final String ARG_POSITION = "position";
private int position;

public static SuperAwesomeCardFragment newInstance(int position) 
    SuperAwesomeCardFragment f = new SuperAwesomeCardFragment();
    Bundle b = new Bundle();
    b.putInt(ARG_POSITION, position);
    f.setArguments(b);
    return f;


@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    position = getArguments().getInt(ARG_POSITION);


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    new DownloadJSON().execute();
    View rootView = inflater.inflate(R.layout.fragment,
            container, false);
    listView = (ListView) rootView.findViewById(android.R.id.list);
    useradapter = new UsersAdapter(getActivity(), android.R.id.list, arrayOfUsers);
    listView.setAdapter(useradapter);
    //Return the View for the fragment's UI
    return rootView;


// DownloadJSON AsyncTask
private class DownloadJSON extends AsyncTask<Void, Void, Void> 

    @Override
    protected void onPreExecute() 
        super.onPreExecute();
        // Create a progressdialog
        mProgressDialog = new ProgressDialog(getActivity());
        // Set progressdialog title
        mProgressDialog.setTitle("Connecting to server");
        // Set progressdialog message
        mProgressDialog.setMessage("Serving...");
        mProgressDialog.setIndeterminate(false);
        // Show progressdialog
        mProgressDialog.show();
    

    @Override
    protected Void doInBackground(Void... params) 
        String statusStr;
        switch (position) 
            case 0:
                statusStr = "UNREAD";
                break;
            case 1:
                statusStr = "PROCCC";
                break;
            case 2:
                statusStr = "COMPLETE";
                break;
            default:
                statusStr = "UNKNOWN";
        
        arraylist = new ArrayList<HashMap<String, String>>();
        jsonobject = JSONfunctions
                .getJSONfromURL("http://example.com/?id=" + statusStr);
        try 
            // Locate the array name in JSON
            ja = jsonobject.getJSONArray("all_orders");
         catch (JSONException e) 
            Log.e("Error", e.getMessage());
            e.printStackTrace();
        
        return null;
    

    @Override
    protected void onPostExecute(Void args) 
        arrayOfUsers.clear();
        arrayOfUsers.addAll(User.fromJson(ja));
        System.out.println(arrayOfUsers.toString());
        listView.setAdapter(useradapter);
        // Close the progressbar
        mProgressDialog.dismiss();
        useradapter.notifyDataSetChanged();
    

没有接触任何其他文件。

这是我创建的自定义适配器(UserAdapter.java):

public class UsersAdapter extends ArrayAdapter<User> 
private  Context context;
private List<User> objects;
public UsersAdapter(Context context, int textViewResourceId, List<User> objects) 
    super(context, textViewResourceId, objects);
    // TODO Auto-generated constructor stub
    this.objects=objects;
    this.context = context;


private  class ViewHolder 
    TextView name;
    TextView home;


@Override
public View getView(int position, View convertView, ViewGroup parent) 
    ViewHolder viewHolder; // view lookup cache stored in tag
    // Get the data item for this position
    User user = getItem(position);
    // Check if an existing view is being reused, otherwise inflate the view
    LayoutInflater mInflater = (LayoutInflater) context
            .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) 
        viewHolder = new ViewHolder();
        convertView = mInflater.inflate(R.layout.list_row, null);
        viewHolder.name = (TextView) convertView.findViewById(R.id.tvName);
        viewHolder.home = (TextView) convertView.findViewById(R.id.tvHome);
        convertView.setTag(viewHolder);
     else 
        viewHolder = (ViewHolder) convertView.getTag();
    
    // Populate the data into the template view using tYiuhe data object
    viewHolder.name.setText(user.ord_name);
    viewHolder.home.setText(user.ord_id);
    // Return the completed view to render on screen
    return convertView;

我能够成功运行应用程序(在 Log Cat 中没有看到任何错误或异常)。但是,行为相当突然:

    第一次加载应用程序:当我按下 Tab 1 和 Tab 2 时,它会获取数据并填充列表视图(预期)。 但是,当我按下最后一个选项卡(选项卡 3)时,它不会从服务器刷新/获取数据。 单击完所有三个选项卡后:选项卡 1 和选项卡 3 不获取数据,也不加载列表。片段是空白的。只有选项卡 2 显示列表视图,但不刷新来自服务器的数据。 选项卡总数等于 3。

行为 2 每次都重复,无论我尝试什么组合。

我对 Android 开发还很陌生,因此无法调试此行为。

感谢任何帮助。

更新: 我能够通过覆盖 setUserVisibleHint 来带来所需的行为:

public void setUserVisibleHint(boolean isVisibleToUser) 
        super.setUserVisibleHint(isVisibleToUser);

        if (isVisibleToUser) 
            new DownloadJSON().execute();
            Log.d("MyFragment", "Fragment is visible.");
        
        else 

            Log.d("MyFragment", "Fragment is not visible.");
        
    

这是规定的方式吗

【问题讨论】:

【参考方案1】:

我看了一点你的代码,但发现了一些错误:

首先改变这个:

    @Override
    protected void onPostExecute(Void args) 
    arrayOfUsers.clear();
    arrayOfUsers.addAll(User.fromJson(ja));
    if(useradapter!=null)
    useradapter.notifyDataSetChanged();
    
        // Close the progressbar
    mProgressDialog.dismiss();
    

下一步:像这样创建您的用户数组:

private ArrayList<User> arrayOfUsers=new ArrayLit<User>();

改变这个:

 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    View rootView = inflater.inflate(R.layout.fragment,
            container, false);
    listView = (ListView) rootView.findViewById(android.R.id.list);
    if(userAdapter==null)
    userAdapter=new UsersAdapter(getActivity(), android.R.id.list,arrayOfUsers);
    listView.setAdapter(userAdapter);
    
    return rootView;

【讨论】:

感谢您的审阅。非常感激。可悲的是,它没有用。我认为其他是错误的。

以上是关于PagerSlidingTabStrip- 使用列表片段的自定义视图显示突然的行为的主要内容,如果未能解决你的问题,请参考以下文章

pagerslidingtabstrip 横向滑动

AndroidSlidingUpPanel 与 PagerSlidingTabStrip

PagerSlidingTabStrip实现网易新闻导航栏效果

PagerSlidingTabStrip 的使用介绍

PagerSlidingTabStrip 的使用介绍

仿网易新闻导航栏PagerSlidingTabStrip源码分析