如何打开新活动并滚动到特定的子视图?

时间:2016-05-31 14:13:50

标签: android listview

亲爱的StackOverflow社区,我可以请求帮助吗?

我是一名非常业余的程序员,正在尝试开发参考文档的应用版本,并且需要可搜索。我无法将搜索结果链接回文档活动并向下滚动到目标文本。

我有一个MainActivity在协调器布局中的滚动视图中显示文档,所以我可以使用浮动操作按钮。在content_main布局的顶部,我创建了一些按钮,这些按钮将使用smoothScrollTo向下滚动到scrollview的特定子视图(部分标题)。他们工作正常。

但该文件需要可搜索。我创建了一个ArrayList,它在一个名为SearchActivity的活动中以列表视图(来自www.androidhive.com中的示例)提供搜索结果。我正在尝试研究如何在listview搜索结果上使用点击来打开content_main布局并向下滚动到特定的子视图。 我已经尝试过在SO(Click on a TextView opens new activity and jumps to a specific id; Android New Intent start particular method)中建议的方法,但两者都没有奏效。我在网上找不到任何其他东西让我知道如何管理它。谁能提出建议?这是我试过的一种方式。这将打开活动,但不会滚动。

我很感激任何帮助。

MainActivity:

public class MainActivity extends AppCompatActivity { 


Button buttonHeader3a, buttonHeader3b, buttonHeader3c, buttonHeader3d; 
ScrollView myView; 

TextView myTV; 
TextView hdr3a, hdr3b, hdr3c, hdr3d; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 

@Override 
       public void onClick(View v) { 
       Intent i = new Intent(MainActivity.this, SearchActivity.class); 
       startActivity(i); 
        } 
    }); 


    buttonHeader3a = (Button) findViewById(R.id.b1); 
    buttonHeader3b = (Button) findViewById(R.id.b2); 
    buttonHeader3c = (Button) findViewById(R.id.b3); 
    buttonHeader3d = (Button) findViewById(R.id.b4); 

    myView = (ScrollView) findViewById(R.id.myview); 
    myTV = (TextView) findViewById(R.id.ch3p16); 

    hdr3a = (TextView) findViewById(R.id.header3a);   //hdr = header 
    hdr3b = (TextView) findViewById(R.id.header3b); 
    hdr3c = (TextView) findViewById(R.id.header3c); 
    hdr3d = (TextView) findViewById(R.id.header3d); 


    buttonHeader3a.setOnClickListener(new Button.OnClickListener() { 


        public final void onClick(View view) { 
            new Handler().post(new Runnable() { 
                @Override 
                public void run() { 
                    myView.smoothScrollTo(0, hdr3a.getTop()); 
                } 
            }); 
        } 
    }); 

    buttonHeader3b.setOnClickListener(new Button.OnClickListener() {   

        public final void onClick(View view) { 
            new Handler().post(new Runnable() { 
                @Override 
                public void run() { 
                    myView.smoothScrollTo(0, hdr3b.getTop()); 
                } 
            }); 
        }
    }); 

    buttonHeader3c.setOnClickListener(new Button.OnClickListener() { 

        public final void onClick(View view) { 
            new Handler().post(new Runnable() { 
                @Override 
                public void run() { 
                    myView.smoothScrollTo(0, hdr3c.getTop()); 
                } 
            }); 
        } 
    }); 


    buttonHeader3d.setOnClickListener(new Button.OnClickListener() { 


        public final void onClick(View view) { 
            new Handler().post(new Runnable() { 
                @Override 
                public void run() { 
                    myView.smoothScrollTo(0, hdr3d.getTop()); 
                } 
            }); 
        } 
    }); 
} 

    public void onButtonLinkPrealerting (View v) { 
        if (v.getId() == R.id.buttonLinkPrealerting) { 
            Intent i = new Intent(MainActivity.this, Chapter4.class); 
            startActivity(i); 
        } 
    } 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
        return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 


// Here's where i'm trying to pick up an intent in SearchActivity and scroll down 


@Override 
protected void onNewIntent (Intent intent) { 
    super.onNewIntent (intent); 
    if(intent.getStringExtra("methodName").equals("myMethod")) { 
        myView.post(new Runnable() { 
            @Override 
            public void run() { 
                myView.smoothScrollTo(0, hdr3a.getTop()); 
            } 
        }); 
    } 
} 

// similar methods to scroll to other sections... 

}

SearchActivity:

public class SearchActivity extends Activity {


// List view
private ListView lv;

// Listview Adapter
ArrayAdapter<String> adapter;

// Search EditText
EditText inputSearch;


// ArrayList for Listview
ArrayList<HashMap<String, String>> productList;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_search);


    // Listview Data
    String products[] = {
            "first very long string",
            "second very long string",
    // Several other very long strings
            };

    lv = (ListView) findViewById(R.id.list_view);
    inputSearch = (EditText) findViewById(R.id.inputSearch);

    // Adding items to listview
    adapter = new ArrayAdapter<String>(this, R.layout.list_item, R.id.product_name, products);
    lv.setAdapter(adapter);

    /**
     * Enabling Search Filter
     * */
    inputSearch.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
            // When user changed the Text
            SearchActivity.this.adapter.getFilter().filter(cs);
        }

        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                                      int arg3) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable arg0) {
            // TODO Auto-generated method stub
        }
    });


    lv.setOnItemClickListener(
       new AdapterView.OnItemClickListener() {
     @Override
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
     String a = parent.getAdapter().getItem(position).toString();


     if (a.equals"first very long string"))
      {
      Intent intent = new Intent ();
      intent.setClass (getBaseContext(), MainActivity.class);
      intent.putExtra("methodName", "myMethod");
      startActivity(intent);
                                 }

      else

      if (a.equals"second very long string"))

 // more of the same

          }
          });
          }
          }

1 个答案:

答案 0 :(得分:2)

如果我是你,我会将Select A.*, case when T1.Name=T2.Name and T1.Area=T2.Area then 'In T1 and T2 and Equal' when T2.Name is null then 'In T1 Only' when T1.Name is null then 'in T2 Only,omitted in T1' when T1.Name = T2.Name and T1.Area<> T2.Area then 'In T1 and T2 Different area' from ( Select t1.*, T2.* FROM table1 T1 LEFT JOIn table2 T2 on T1.Name = T2.Name and T1.Area = T2.Area UNION Select t1.*, T2.* FROM table1 T1 RIGHT JOIN table2 T2 on T1.Name = T2.Name and T1.Area = T2.Area) A (在MainActivity中)的逻辑移到onNewIntent中。

根据文件,

  

处理onNewIntent()以通知片段管理器        状态未保存。如果你正在处理新的意图,可能会        更改片段状态,您希望确保调用        先来到这里的超级班。否则,如果你的状态        保存,但活动没有停止,你可以得到一个        onNewIntent()调用在onResume()之前发生并尝试进行        在该点执行片段操作将抛出IllegalStateException        因为片段管理器认为状态仍然存在。

因此,只需检查在创建活动时是否将数据传递给您的活动onCreate:

onCreate